2017-04-10 8 views
4

NetfilterQueue 및 scapy를 사용하여 모니터 및 변조 패킷 프로그램을 완료합니다.NetfilterQueue set_payload가 작동하지 않습니다.

하지만 NetfilterQueue 모듈의 set_payload() 메소드가 저에게 효과적이지 않은 것 같습니다.

다음은 내 소스 코드입니다.

from netfilterqueue import NetfilterQueue as nfqueue 
from scapy.all import * 
import os 
import socket 
import re 

baidu_ip = socket.gethostbyname('www.baidu.com') 
print "Got baidu ip: " + baidu_ip 

iptablesr = 'iptables -t mangle -A POSTROUTING -p tcp -j NFQUEUE --queue-num 1' 
print("Adding iptable rules :") 
print(iptablesr) 
os.system(iptablesr) 
iptablesr = 'iptables -t mangle -A POSTROUTING -p udp -j NFQUEUE --queue-num 1' 
print(iptablesr) 
os.system(iptablesr) 


def callback(packet): 
    modified = False 
    sca_pkt = IP(packet.get_payload()) 

    # This is the main logic, to modify the packet 
    try: 
     dns_lookup = re.search(r'DNS Qry "([\w\.]+)"', sca_pkt[DNS].summary()).group(1) 
     if re.search(r'baidu\.com', dns_lookup) != None: 
      sca_pkt[DNS].qd = DNSQR(qname='www.163.com') 
      sca_pkt[UDP].len = len(bytes(sca_pkt[UDP])) 
      sca_pkt[UDP].chksum = 0x0000 
      modified = True 
    except: 
     pass 

    # Accept the modified packet 
    if modified == True: 
     print 'debug sca_pkt: ' + sca_pkt.summary() 
     packet.set_payload(str(sca_pkt)) 
     print 'debug packet: ' + IP(packet.get_payload()).summary() 
     packet.accept() 
     return 

    packet.accept() 

def main(): 
    q = nfqueue() 
    q.bind(1, callback) 
    try: 
     q.run() 
    except KeyboardInterrupt: 
     q.unbind() 
     print "Flushing iptables." 
     os.system('iptables -F') 
     os.system('iptables -F -t mangle') 

if __name__ == '__main__': 
    main() 

그리고 이것은 내가 얻은 결과입니다.

Got baidu ip: 180.97.33.108 
Adding iptable rules : 
iptables -t mangle -A POSTROUTING -p tcp -j NFQUEUE --queue-num 1 
iptables -t mangle -A POSTROUTING -p udp -j NFQUEUE --queue-num 1 
debug sca_pkt: IP/UDP/DNS Qry "www.163.com" 
debug packet: IP/UDP/DNS Qry "baidu.com." 

디버그 정보에서 볼 수있는 set_payload()가 작동하지 않았습니다. (패킷을 sca_pkt에 표시된 값으로 설정했지만 패킷 페이로드 요약을 얻은 후에도 원래 값입니다.)

그리고 필자는 pip 버전과 https://github.com/kti/python-netfilterqueue.git 버전을 포함하여 NetfilterQueue의 두 가지 버전을 시도했습니다.

아무도 도와 줄 수 있습니까? 나는 이것에 대해 매우 궁금하다.

+0

수정 사항을 찾으셨습니까? 동일한 문제가 붙어있다 – Ymartin

답변

0

사용중인 scapy 버전을 모르지만 set_payload은 더 이상 사용되지 않습니다.

packet.payload = sca_pkt.payload 

이 또한 UDP 필드를 변경되므로주의 : 당신은 뭔가를 시도해야

packet.set_payload(str(sca_pkt)) 

:의

INSEAD. DNS 만 변경하려는 경우 다음을 사용하십시오.

packet[DNS] = sca_pkt[DNS] 
+0

set_payload는 대개 사용되지 않지만 사용중인 버전은 그렇지 않다는 것을 알고있다. 적어도이 문서는 그런 말을하지 않았습니다. 개미는이 두 가지가 옳지 않습니다. netfilterqueue.Packet 객체가 항목 할당을 지원하지 않거나 속성 페이로드가 유효하지 않기 때문에 프로그램에서 TypeError 예외를 발생시킵니다. – NRdE

+0

scapy 버전을 업데이트 해 보셨습니까? (GitHub에서 DEV를 다운로드하십시오.) – Cukic0d

+0

아니요, 나중에 시도하겠습니다. 고마워요! – NRdE

관련 문제