A-A+

TCP协议区分windows和linux实践 – 远程系统识别

2024年10月31日 13:50 汪洋大海 暂无评论 共2625字 (阅读57 views次)

一、TCP协议区分windows和linux实践前言

最近看到可以通过TCP协议的重试次数识别不同系统(之前都是通过TTL识别,但是不是很靠谱),比较感兴趣,遂进行探索,最后也将两种方式结合武器化。

二、windows和linux实践如何识别系统

1、网络协议栈:比如nmap通过数据包的字段、字段内容进行判断。

2、应用类型:比如SSH一般都是Linux、RDP 一般都是windows

3、应用返回:比如banner返回以及一些报错

图片
0

这里我们武器化一个好用的通过协议识别的工具。

三、windows和linux区分实践

这里是根据TCP三次握手的第二次失败重传的次数去判断的,经过测试这种方法是靠谱的。那么其他情况的重传、网络异常处理情况等等都可以作为特征区分。

linux系统

linux一共传6次,没收到rst的情况下

图片
1

windows

windows一共传3次,没收到rst的情况下

图片
2

为了防止内核自动发送的rst不达到目标机器,使用iptables进行拦截(网上查询scapy可以通过网络延迟不让RST,但是我这里没成功,还是通过iptables拦截)

# 过滤rst
iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 127.0.0.1 -j DROP 
# 可以人工观察
tcpdump -n host 127.0.0.1 -vv

四、武器化

这里给出脚本,在10秒搜集syn+ack返回包的次数,并且打印TTL用于辅助识别。

from scapy.allimport*
from scapy.layers.inet import IP, TCP


count =0




defsend_tcp_syn(ip_str, port_int):
    ans = sr1(IP(dst=ip_str)/ TCP(dport=port_int, flags="S", sport=RandShort(), seq=RandInt()), verbose=False)




defprn(pkt):
global count
    count = count +1


if pkt.haslayer(IP)and pkt.haslayer(TCP):
        ip_layer = pkt.getlayer(IP)
        tcp_layer = pkt.getlayer(TCP)
# 获取窗口大小
        window_size = tcp_layer.window


# 获取最大段大小(MSS)选项
        mss_option =""
for option in tcp_layer.options:
if option[0]=='MSS':
                mss_option = option[1]
break
print(f"Source IP: {ip_layer.src}, Destination IP: {ip_layer.dst}, TTL: {ip_layer.ttl}")
print(f"Source Port: {tcp_layer.sport}, Destination Port: {tcp_layer.dport}, WIN: {window_size} , MSS: {mss_option}")




defget_result():
global count
    time.sleep(10)
if count >3:
print("linux")


if count ==3:
print("windows")
    os._exit(0)




deflisten_port(interface_str, ip_str):
    sniff(iface=interface_str,filter='tcp and src host %s and tcp[13:1] = 18'% target_ip, prn=prn)




if __name__ =='__main__':
    interface =""
if platform =="darwin":
        interface ="en0"
elif platform =="linux":
        interface ="eth0"


ifnot interface:
print("No interface specified")
        exit()


iflen(sys.argv)>1:
        target_ip = sys.argv[1]
        port = sys.argv[2]
else:
        target_ip ="127.0.0.1"
        port =1433


print(f"iptables -A OUTPUT -p tcp --tcp-flags RST RST -d {target_ip} -j DROP ")
    listen_thread = threading.Thread(target=listen_port, args=(interface, target_ip,))
    listen_thread.start()


    result_thread = threading.Thread(target=get_result, args=())
    result_thread.start()
    send_tcp_syn(target_ip,int(port))
图片
3
python3 CheckSystemByPort.py 127.0.0.1 1433 

五、总结

这里总结了三种远程识别系统的方法,并且武器化了一个通过TCP协议栈识别的工具(相比于nmap靠谱点)

 

文章来源:https://mp.weixin.qq.com/s?__biz=MzU1NzkwMzUzNg==&mid=2247484307&idx=1&sn=32a01fd3c10d960614235020f217c092&chksm=fc2ff84ccb58715a3d26071f72777b3a19fd3688bb359d5a3500a95db614f48d6bb959ba5eb8&cur_album_id=3598565437530521605&scene=189#wechat_redirect

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言