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의 두 가지 버전을 시도했습니다.
아무도 도와 줄 수 있습니까? 나는 이것에 대해 매우 궁금하다.
수정 사항을 찾으셨습니까? 동일한 문제가 붙어있다 – Ymartin