配置yum源以及telnet

cd /eetc/yum.repos.d/
rm -rf ./*
vim /etc/yum.repos.d/a.repo

a.repo
[a]
name=a
baseurl=http://172.17.15.200/Centos1511
gpgcheck=0
enabled=1
:wq
sudo yum install -y telnet-server xinetd

sudo vi /etc/xinetd.d/telnet

service telnet
{
    flags           = REUSE
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/sbin/in.telnetd
    log_on_failure  += USERID
    disable         = no   # ← 改这里!
 
}
sudo systemctl restart xinetd
useradd hxl17
passwd hxl17

完成代码 telnet.py

# sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
from scapy.all import *
import random
local_ip = "192.168.17.128"
target_ip = "192.168.17.129"
local_port = int(input("input a number between 1024 - 65535:"))
target_port = 23
ip = IP(src=local_ip, dst=target_ip)

seq = 10

syn_ack = sr1(ip/TCP(sport=local_port, dport=target_port, seq=seq, flags="S"))

send(ip/TCP(sport=local_port, dport=target_port, seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags="A"))
seq = syn_ack[TCP].ack
ack = syn_ack[TCP].seq + 1
send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="PA")/Raw(load=b'\xff\xfd&\xff\xfb&\xff\xfd\x03\xff\xfb\x18\xff\xfb\x1f\xff\xfb \xff\xfb!\xff\xfb"\xff\xfb\'\xff\xfd\x05\xff\xfb#'))
filter_str = (
    "tcp and len > 40"
)

response = sniff(
    filter=filter_str,
    count=1,
    timeout=20
)

seq += len(b'\xff\xfd&\xff\xfb&\xff\xfd\x03\xff\xfb\x18\xff\xfb\x1f\xff\xfb \xff\xfb!\xff\xfb"\xff\xfb\'\xff\xfd\x05\xff\xfb#')

ack = response[0][TCP].seq + len(response[0][Raw].load)

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="A"))

response = sniff(
    filter=filter_str,
    count=1,
    timeout=20
)

ack = response[0][TCP].seq + len(response[0][Raw].load)

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="A"))

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="PA")/Raw(load=b"\xff\xfa\x1f\x00M\x00\x1c\xff\xf0\xff\xfa \x0038400,38400\xff\xf0\xff\xfa#\x00kali:0.0\xff\xf0\xff\xfa'\x00\x00DISPLAY\x01kali:0.0\xff\xf0\xff\xfa\x18\x00XTERM-256COLOR\xff\xf0"))

seq += len(b"\xff\xfa\x1f\x00M\x00\x1c\xff\xf0\xff\xfa \x0038400,38400\xff\xf0\xff\xfa#\x00kali:0.0\xff\xf0\xff\xfa'\x00\x00DISPLAY\x01kali:0.0\xff\xf0\xff\xfa\x18\x00XTERM-256COLOR\xff\xf0")
response = sniff(
    filter=filter_str,
    count=1,
    timeout=20
)

ack = response[0][TCP].seq + len(response[0][Raw].load)

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="PA")/Raw(load=b'\xff\xfc\x01'))

seq += len(b'\xff\xfc\x01')
response = sniff(
    filter=filter_str,
    count=1,
    timeout=20
)

ack = response[0][TCP].seq + len(response[0][Raw].load)

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="PA")/Raw(load=b'\xff\xfd\x01'))

seq += len(b'\xff\xfc\x01')
response = sniff(
    filter=filter_str,
    count=1,
    timeout=20
)

ack = response[0][TCP].seq + len(response[0][Raw].load)

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="A"))

response = sr1(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="PA")/Raw(load=b'hxl\r\x00'))

seq += len(b"hxl\r\x00")

ack = response[0][TCP].seq + len(response[0][Raw].load)
print(len(response))
print(len(response[0][Raw].load))

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="A"))

response = sniff(
    filter=filter_str,
    count=1,
    timeout=20
)
ack = response[0][TCP].seq + len(response[0][Raw].load)

send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="A"))

response = sr1(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="PA")/Raw(load=b'hxl17\r\x00'))
seq += len(b'hxl17\r\x00')

ack = response[0][TCP].seq + len(response[0][Raw].load)

response = sr1(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="A"))
#登录进去了!!!!!!!!!!

ack = response[0][TCP].seq + len(response[0][Raw].load)

response = sr1(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="PA")/Raw(load=b'cat test.txt\r\n'))

seq += len(b"cat test.txt\r\n")
ack = response[0][TCP].seq + len(response[0][Raw].load)
print(response[0][Raw].load)
send(ip/TCP(sport=local_port, dport=target_port, seq=seq, ack=ack, flags="A"))

监测代码 zhuabao.py


from scapy.all import *
import datetime

# 配置抓包参数
src_ip = "192.168.17.128"  # 本机IP
dst_ip = "192.168.17.129"  # 靶机IP
telnet_port = 23  # Telnet默认端口
output_pcap = "telnet_full_flow.pcap"  # 保存的抓包文件

# 存储捕获的数据包
captured_packets = []

# -------------------------- 关键修复:补充所有Telnet控制码定义 --------------------------
IAC = b'\xff'  # 中断符(选项协商起始)
DO = b'\xfd'  # 请求启用选项
DONT = b'\xfe'  # 拒绝启用选项(之前缺失!)
WILL = b'\xfb'  # 同意启用选项
WONT = b'\xfc'  # 不同意启用选项

# 目标选项码(你关注的4个选项)
TERMINAL_TYPE = b'\x18'  # Terminal Type
TERMINAL_SPEED = b'\x20'  # Terminal Speed
X_DISPLAY_LOC = b'\x23'  # X Display Location
NEW_ENVIRON = b'\x27'  # New Environment Option


def packet_handler(pkt):
    """数据包回调:过滤Telnet流量 + 打印完整包体 + 解析关键信息(容错处理)"""
    try:  # 捕获解析异常,避免抓包中断
        if IP in pkt and TCP in pkt:
            ip_src = pkt[IP].src
            ip_dst = pkt[IP].dst
            tcp_sport = pkt[TCP].sport
            tcp_dport = pkt[TCP].dport

            # 过滤目标流量(本机↔靶机的Telnet端口)
            if (ip_src == src_ip and ip_dst == dst_ip and tcp_dport == telnet_port) or \
                    (ip_src == dst_ip and ip_dst == src_ip and tcp_sport == telnet_port):

                captured_packets.append(pkt)
                time_str = datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]
                print("=" * 100)
                print(f"[{time_str}] 捕获Telnet数据包:{ip_src}:{tcp_sport} → {ip_dst}:{tcp_dport}")
                print("-" * 100)

                # 1. 打印完整包体结构(Ethernet+IP+TCP+Raw)
                print("【完整包体内容】")
                pkt.show()
                print("-" * 100)

                # 2. 解析TCP标志位和关键字段
                flags = pkt[TCP].flags
                flag_str = ""
                flag_desc = []
                if flags & 0x01:
                    flag_str += "F"
                    flag_desc.append("FIN(关闭连接)")
                if flags & 0x02:
                    flag_str += "S"
                    flag_desc.append("SYN(发起连接)")
                if flags & 0x04:
                    flag_str += "R"
                    flag_desc.append("RST(重置连接)")
                if flags & 0x08:
                    flag_str += "P"
                    flag_desc.append("PUSH(推送数据)")
                if flags & 0x10:
                    flag_str += "A"
                    flag_desc.append("ACK(确认接收)")
                print(f"【TCP标志位】: {flag_str} → {', '.join(flag_desc) if flag_desc else '无特殊标志'}")
                print(f"【TCP关键字段】: 序号(seq)={pkt[TCP].seq}, 确认号(ack)={pkt[TCP].ack}")
                print("-" * 100)

                # 3. 解析Telnet数据(容错处理:即使解析失败也不中断抓包)
                if Raw in pkt:
                    raw_data = pkt[Raw].load
                    print("【Telnet数据解析】")
                    if b'\xff' in raw_data:
                        print(f"  类型: Telnet选项协商")
                        print(f"  十六进制数据: {raw_data.hex()}")
                        parse_telnet_negotiation(raw_data)  # 调用修复后的解析函数
                    else:
                        try:
                            plain_text = raw_data.decode("ascii")
                            print(f"  类型: 明文数据")
                            print(f"  内容: {repr(plain_text)}")  # 显示换行符等不可见字符
                        except:
                            print(f"  类型: 非ASCII数据")
                            print(f"  十六进制: {raw_data.hex()}")
                else:
                    print("【Telnet数据解析】: 无Raw负载(仅TCP控制包)")
                print("=" * 100 + "\n")
    except Exception as e:
        print(f"【解析警告】: 数据包解析出错(不影响抓包)→ {str(e)}")
        print("=" * 100 + "\n")


def parse_telnet_negotiation(data):
    """修复后的协商解析函数:兼容所有控制码,避免报错"""
    # 控制码→名称映射(包含所有可能的指令,避免KeyError)
    cmd_map = {
        DO: "DO",
        DONT: "DONT",  # 补充缺失的DONT
        WILL: "WILL",
        WONT: "WONT"
    }
    # 选项码→名称映射(包含你关注的4个选项)
    opt_map = {
        TERMINAL_TYPE: "Terminal Type(终端类型)",
        TERMINAL_SPEED: "Terminal Speed(终端速率)",
        X_DISPLAY_LOC: "X Display Location(X显示位置)",
        NEW_ENVIRON: "New Environment Option(新环境选项)",
        b'\x03': "Suppress Go Ahead(禁止继续)",
        b'\x05': "Status(状态查询)",
        b'\x1f': "Terminal Location Number(终端位置编号)",
        b'\x20': "Terminal Speed(终端速率)",
        b'\x21': "Remote Flow Control(远程流量控制)",
        b'\x22': "Linemode(行模式)",
        b'\x26': "TN3270 Regime(TN3270模式)",
        b'\x27': "New Environment Option(新环境选项)"
    }

    i = 0
    while i < len(data):
        if data[i:i + 1] == IAC and i + 2 < len(data):
            cmd = data[i + 1:i + 2]
            opt = data[i + 2:i + 3]
            cmd_name = cmd_map.get(cmd, f"未知指令(0x{cmd.hex()})")
            opt_name = opt_map.get(opt, f"未知选项(0x{opt.hex()})")
            print(f"    → 协商指令: IAC(0xff) + {cmd_name}(0x{cmd.hex()}) + {opt_name}(0x{opt.hex()})")
            i += 3  # 跳过当前3字节协商指令
        else:
            i += 1


def save_captured_packets():
    """保存数据包到PCAP文件"""
    if captured_packets:
        wrpcap(output_pcap, captured_packets)
        print(f"\n=== 抓包结束 ===")
        print(f"共捕获 {len(captured_packets)} 个数据包,文件已保存为: {output_pcap}")
    else:
        print("\n=== 抓包结束 ===")
        print("未捕获到目标流量")


if __name__ == "__main__":
    print(f"=== 开始抓取 {src_ip} ↔ {dst_ip} 的Telnet流量(端口{telnet_port})===")
    print("特点:打印完整包体(.show())+ 解析Telnet协商/明文数据 + 容错不中断")
    print("按 Ctrl+C 停止抓包\n")

    try:
        # 启动抓包(L2层抓包,保留Ethernet头;添加超时重试)
        sniff(
            filter=f"tcp and host {src_ip} and host {dst_ip} and port {telnet_port}",
            prn=packet_handler,
            store=0,
            count=0,
            iface=None  # 自动选择默认网卡(若抓不到可指定网卡名,如"eth0")
        )
    except KeyboardInterrupt:
        save_captured_packets()
    except Exception as e:
        print(f"\n抓包核心错误:{str(e)}")
        save_captured_packets()
posted on 2025-11-12 22:35  suiseiseki  阅读(16)  评论(0)    收藏  举报