|
1 | 1 | import argparse, asyncio, io, os, enum, struct, collections, hashlib, ipaddress, socket, random
|
2 | 2 | import pproxy
|
3 |
| -from . import enums, message, crypto, ip, dns |
| 3 | +from . import enums, message, crypto, ip |
4 | 4 | from .__doc__ import *
|
5 | 5 |
|
6 | 6 | class State(enum.Enum):
|
@@ -383,8 +383,7 @@ def datagram_received(self, data, addr, *, response_header=b''):
|
383 | 383 | class SPE_4500(IKE_500):
|
384 | 384 | def __init__(self, args, sessions):
|
385 | 385 | IKE_500.__init__(self, args, sessions)
|
386 |
| - self.tcp_stack = {} |
387 |
| - self.dnscache = dns.DNSCache() |
| 386 | + self.ippacket = ip.IPPacket(args) |
388 | 387 | def datagram_received(self, data, addr):
|
389 | 388 | spi = data[:4]
|
390 | 389 | if spi == b'\xff':
|
@@ -420,75 +419,7 @@ def reply(data):
|
420 | 419 | sa.msgid_out += 1
|
421 | 420 | self.transport.sendto(encrypted, addr)
|
422 | 421 | return True
|
423 |
| - if header == enums.IpProto.IPV4: |
424 |
| - proto, src_ip, dst_ip, ip_body = ip.parse_ipv4(data) |
425 |
| - dst_name = self.dnscache.ip2domain(str(dst_ip)) |
426 |
| - if proto == enums.IpProto.UDP: |
427 |
| - src_port, dst_port, udp_body = ip.parse_udp(ip_body) |
428 |
| - if dst_port == 53: |
429 |
| - try: |
430 |
| - record = dns.DNSRecord.unpack(udp_body) |
431 |
| - answer = self.dnscache.query(record) |
432 |
| - print(f'IPv4 DNS -> {dst_name}:{dst_port} Query={record.q.qname}{" (Cached)" if answer else ""}') |
433 |
| - if answer: |
434 |
| - ip_body = ip.make_udp(dst_port, src_port, answer.pack()) |
435 |
| - data = ip.make_ipv4(proto, dst_ip, src_ip, ip_body) |
436 |
| - reply(data) |
437 |
| - return |
438 |
| - except Exception as e: |
439 |
| - print(e) |
440 |
| - else: |
441 |
| - print(f'IPv4 UDP -> {dst_name}:{dst_port} Length={len(udp_body)}') |
442 |
| - def udp_reply(udp_body): |
443 |
| - #print(f'IPv4 UDP Reply {dst_ip}:{dst_port} -> {src_ip}:{src_port}', result) |
444 |
| - if dst_port == 53: |
445 |
| - record = dns.DNSRecord.unpack(udp_body) |
446 |
| - if not self.args.nocache: |
447 |
| - self.dnscache.answer(record) |
448 |
| - print(f'IPv4 DNS <- {dst_name}:{dst_port} Answer=['+' '.join(f'{r.rname}->{r.rdata}' for r in record.rr)+']') |
449 |
| - else: |
450 |
| - print(f'IPv4 UDP <- {dst_name}:{dst_port} Length={len(udp_body)}') |
451 |
| - ip_body = ip.make_udp(dst_port, src_port, udp_body) |
452 |
| - data = ip.make_ipv4(proto, dst_ip, src_ip, ip_body) |
453 |
| - reply(data) |
454 |
| - asyncio.ensure_future(self.args.urserver.udp_sendto(dst_name, dst_port, udp_body, udp_reply, (str(src_ip), src_port))) |
455 |
| - elif proto == enums.IpProto.TCP: |
456 |
| - src_port, dst_port, flag, tcp_body = ip.parse_tcp(ip_body) |
457 |
| - #else: |
458 |
| - # print(f'IPv4 TCP {src_ip}:{src_port} -> {dst_ip}:{dst_port}', ip_body) |
459 |
| - key = (addr[0], src_port) |
460 |
| - if key not in self.tcp_stack: |
461 |
| - if flag & 2: |
462 |
| - print(f'IPv4 TCP -> {dst_name}:{dst_port} Connect') |
463 |
| - for spi, tcp in list(self.tcp_stack.items()): |
464 |
| - if tcp.obsolete(): |
465 |
| - self.tcp_stack.pop(spi) |
466 |
| - self.tcp_stack[key] = tcp = ip.TCPStack(src_ip, src_port, dst_ip, dst_name, dst_port, reply, self.args.rserver) |
467 |
| - else: |
468 |
| - tcp = self.tcp_stack[key] |
469 |
| - tcp.parse(ip_body) |
470 |
| - elif proto == enums.IpProto.ICMP: |
471 |
| - icmptp, code, icmp_body = ip.parse_icmp(ip_body) |
472 |
| - if icmptp == 0: |
473 |
| - tid, seq = struct.unpack('>HH', ip_body[4:8]) |
474 |
| - print(f'IPv4 PING -> {dst_name} Id={tid} Seq={seq} Data={icmp_body}') |
475 |
| - elif icmptp == 8: |
476 |
| - tid, seq = struct.unpack('>HH', ip_body[4:8]) |
477 |
| - print(f'IPv4 ECHO -> {dst_name} Id={tid} Seq={seq} Data={icmp_body}') |
478 |
| - # NEED ROOT PRIVILEGE TO SEND ICMP PACKET |
479 |
| - # a = socket.socket(socket.AF_INET, socket.SOCK_RAW, proto) |
480 |
| - # a.sendto(icmp_body, (dst_name, 1)) |
481 |
| - # a.close() |
482 |
| - elif icmptp == 3 and code == 3: |
483 |
| - eproto, esrc_ip, edst_ip, eip_body = ip.parse_ipv4(icmp_body) |
484 |
| - eport = int.from_bytes(eip_body[2:4], 'big') |
485 |
| - print(f'IPv4 ICMP -> {dst_name} {eproto.name} :{eport} Denied') |
486 |
| - else: |
487 |
| - print(f'IPv4 ICMP -> {dst_name} Data={ip_body}') |
488 |
| - else: |
489 |
| - print(f'IPv4 {enums.IpProto(proto).name} -> {dst_name} Data={data}') |
490 |
| - else: |
491 |
| - print(f'{enums.IpProto(header).name} Unhandled Protocol. Data={data}') |
| 422 | + self.ippacket.handle(addr[0], header, data, reply) |
492 | 423 | else:
|
493 | 424 | print('unknown packet', data, addr)
|
494 | 425 |
|
|
0 commit comments