1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
#ifndef PROTO_TCP_H
#define PROTO_TCP_H
#include "massip-addr.h"
#include "stack-queue.h"
#include "output.h"
struct Adapter;
struct TCP_Control_Block;
struct TemplatePacket;
struct TCP_ConnectionTable;
struct lua_State;
#define TCP_SEQNO(px,i) (px[i+4]<<24|px[i+5]<<16|px[i+6]<<8|px[i+7])
#define TCP_ACKNO(px,i) (px[i+8]<<24|px[i+9]<<16|px[i+10]<<8|px[i+11])
#define TCP_FLAGS(px,i) (px[(i)+13])
#define TCP_IS_SYNACK(px,i) ((TCP_FLAGS(px,i) & 0x12) == 0x12)
#define TCP_IS_ACK(px,i) ((TCP_FLAGS(px,i) & 0x10) == 0x10)
#define TCP_IS_RST(px,i) ((TCP_FLAGS(px,i) & 0x4) == 0x4)
#define TCP_IS_FIN(px,i) ((TCP_FLAGS(px,i) & 0x1) == 0x1)
/**
* [KLUDGE] The 'tcpcon' module doens't have access to the main configuration,
* so specific configuration options have to be sent to it using this
* function.
*/
void
tcpcon_set_parameter(struct TCP_ConnectionTable *tcpcon,
const char *name,
size_t value_length,
const void *value);
void scripting_init_tcp(struct TCP_ConnectionTable *tcpcon, struct lua_State *L);
/**
* Create a TCP connection table (to store TCP control blocks) with
* the desired initial size.
*
* @param entry_count
* A hint about the desired initial size. This should be about twice
* the number of oustanding connections, so you should base this number
* on your transmit rate (the faster the transmit rate, the more
* outstanding connections you'll have). This function will automatically
* round this number up to the nearest power of 2, or round it down
* if it causes malloc() to not be able to allocate enoug memory.
* @param entropy
* Seed for syn-cookie randomization
*/
struct TCP_ConnectionTable *
tcpcon_create_table( size_t entry_count,
struct stack_t *stack,
struct TemplatePacket *pkt_template,
OUTPUT_REPORT_BANNER report_banner,
struct Output *out,
unsigned timeout,
uint64_t entropy
);
void tcpcon_set_banner_flags(struct TCP_ConnectionTable *tcpcon,
unsigned is_capture_cert,
unsigned is_capture_servername,
unsigned is_capture_html,
unsigned is_capture_heartbleed,
unsigned is_capture_ticketbleed);
/**
* Gracefully destroy a TCP connection table. This is the last chance for any
* partial banners (like HTTP server version) to be sent to the output. At the
* end of a scan, you'll see a bunch of banners all at once due to this call.
*
* @param tcpcon
* A TCP connection table created with a matching call to
* 'tcpcon_create_table()'.
*/
void
tcpcon_destroy_table(struct TCP_ConnectionTable *tcpcon);
void
tcpcon_timeouts(struct TCP_ConnectionTable *tcpcon, unsigned secs, unsigned usecs);
enum TCP_What {
TCP_WHAT_TIMEOUT,
TCP_WHAT_SYNACK,
TCP_WHAT_RST,
TCP_WHAT_FIN,
TCP_WHAT_ACK,
TCP_WHAT_DATA,
};
int
stack_incoming_tcp(struct TCP_ConnectionTable *tcpcon, struct TCP_Control_Block *entry,
int what, const void *p, size_t length,
unsigned secs, unsigned usecs,
unsigned seqno_them);
/**
* Lookup a connection record based on IP/ports.
*/
struct TCP_Control_Block *
tcb_lookup(
struct TCP_ConnectionTable *tcpcon,
ipaddress ip_src, ipaddress ip_dst,
unsigned port_src, unsigned port_dst);
/**
* Create a new TCB (TCP control block)
*/
struct TCP_Control_Block *
tcpcon_create_tcb(
struct TCP_ConnectionTable *tcpcon,
ipaddress ip_src, ipaddress ip_dst,
unsigned port_src, unsigned port_dst,
unsigned my_seqno, unsigned their_seqno,
unsigned ttl);
/**
* Acknowledge a FIN even if we've forgotten about the connection
*/
void
tcpcon_send_FIN(
struct TCP_ConnectionTable *tcpcon,
ipaddress ip_me, ipaddress ip_them,
unsigned port_me, unsigned port_them,
uint32_t seqno_them, uint32_t ackno_them);
void
tcpcon_send_RST(
struct TCP_ConnectionTable *tcpcon,
ipaddress ip_me, ipaddress ip_them,
unsigned port_me, unsigned port_them,
uint32_t seqno_them, uint32_t ackno_them);
/**
* Send a reset packet back, even if we don't have a TCP connection
* table
*/
void
tcp_send_RST(
struct TemplatePacket *templ,
struct stack_t *stack,
ipaddress ip_them, ipaddress ip_me,
unsigned port_them, unsigned port_me,
unsigned seqno_them, unsigned seqno_me
);
#endif
|