แปลงจากโปรแกรมแบบ stdin ให้กลายเป็น network programming ด้วย xinetd
หลังจากไม่ได้โพสต์มานานนนนนนมาก วันนี้อยากเอาวิธีการแปลง application แบบที่เรารับข้อมูลจากในเครื่องของเราให้กลายเป็นการรับข้อมูลแบบ network ขึ้นมาแทน โดยใช้ xinetd กัน
โดยต้นฉบับของการทำผมเอามาจาก https://github.com/Eadom/ctf_xinetd นี่ครับ
1. Install Docker ในเครื่องให้เรียบร้อย (Link for How to install Docker on Ubuntu)
2. Download https://github.com/Eadom/ctf_xinetd
3. ในไฟล์ ctf.xinetd เราสามารถกำหนดได้ว่า เมื่อมีการติดต่อเข้ามายัง 9999 (สามารถเปลี่ยนได้ที่ port parameter) เราจะรันโปรแกรมอะไรที่ parameter “server_args”
โดยในที่นี้คือ program
4. ตัวอย่างการเขียน program.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> int main() { char input[]="Charles"; printf("Please input your name\r\n"); setvbuf(stdout, NULL, _IONBF, 0); scanf("%s",input); printf("Hello %s\r\n",input); return 0; } |
5. Compile
1 |
gcc -o program program.c |
6. ทดสอบใช้งาน
7. เมื่อ binary ของเราพร้อมแล้ว ทดสอบสร้าง docker image ขึ้นมาโดยรายละเอียดคือตัว container จะรัน xinetd ที่ port 9999 เมื่อเปิดเครื่อง และเมื่อมีการเชื่อมต่อเข้าไปก็จะไปรัน ./program
1 |
docker build . -t xinetd-lab:1.0 |
8. Run container โดยใช้ xinetd-lab:1.0 image
1 |
docker run -itd -p 9999:9999 xinetd-lab:1.0 |
9. ทดสอบเชื่อมต่อเข้าไปโดยใช้ telnet
1 |
telnet <TARGET> 9999 |
10. ทดสอบสร้าง connection โดยใช้ Python ด้วย module pwntools
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/usr/bin/python from pwn import * import re conn = remote('<TARGET>',9999) #response = conn.recv() response = conn.recvline() print response name="World" conn.send(name+"\r\n") response = conn.recvline() print response conn.close() |
หรืออีกแบบที่ทำได้คือใช้ socat
1 |
socat tcp-l:6666,fork exec:./pwn,reuseaddr |
หรือ
1 |
<span class="line"><span>nohup socat tcp </span><span class="_"><span>-l</span></span><span> : 6666, fork </span><span class="built_in"><span>exec</span></span><span> : ./ pwn, reuseaddr &</span></span> |
Reference::
- https://nocbtm.github.io/2019/09/25/pwn%E9%A2%98%E7%9A%84%E6%90%AD%E5%BB%BA/#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C