
CVE-2018-10933 기반
CVE-2018-10933은 특정 버전의 libSSH에서 발견된 취약점으로, 잠재적으로 무제한적인 시스템 접근을 허용할 수 있습니다. 이 취약점은 인증 과정에서 패킷 헤더를 잘못 처리하는 데서 발생하며, MSG_USERAUTH_SUCCESS 바이트가 포함된 조작된 패킷을 보내면 누구나 인증을 우회할 수 있습니다. 그러면 공격자는 시스템에 대한 완전한 접근 권한을 얻게 됩니다.
따라서 이 챌린지의 기본 목표는 참가자들이 제공된 docker 이미지를 살펴보고, 이 취약점을 발견하고, 이를 악용하여 접근 권한을 얻은 다음, 시스템의 심볼릭 링크에 숨겨진 키를 찾도록 하는 것입니다.
Someone got into my machine via port 22...
It looks like they didnt even know my credentials.
Anyways, they made a file with an odd name, but it's gone now,
I wonder if there's still some trace of the filename -
it might be something symbolic of the attacker...
Can you figure out how they got in and help me find the filename?
다음은 의도된 해결 방법에 대한 상세한 풀이입니다.
챌린지 설명에서 공격자가 일반적으로 SSH용으로 예약된 포트인 22번 포트를 통해 접근했음을 알 수 있습니다. 또한 공격자가 자격 증명을 사용하지 않고 접근했음을 알 수 있습니다.
이를 바탕으로, 자격 증명 없이 SSH를 통해 시스템에 접근하는 과거 버그를 찾아보면 MSG_USERAUTH_SUCCESS 바이트와 관련된 문제일 가능성이 매우 높습니다. 또는 22번 포트에 연결을 시작하면 실행 중인 libSSH 버전을 확인한 다음, 해당 버전에 대한 일반적인 익스플로잇을 찾아볼 수 있습니다.
또한 설명에서 찾고자 하는 파일 이름(플래그)이 심볼릭 링크의 대상으로만 존재한다는 것을 알 수 있습니다.
이제 이 취약점을 악용하여 접근 권한을 얻을 수 있다는 것을 알았으므로, 직접 스크립트를 작성하거나 이 익스플로잇을 실행하는 예제 스크립트를 복사하여 대상 시스템에서 명령을 실행할 수 있습니다. 저는 이 해결 방법을 위해 익스플로잇 스크립트를 변형했으며, 이름을 libsshauthbypass.py로 지었습니다.
데모 이미지의 경우, 이 스크립트를 실행하여 시스템에서 플래그를 얻으려면 다음과 유사한 명령을 실행할 수 있습니다:
./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
그러면 다음과 유사한 출력이 생성됩니다.
sspringer-fedora-CVE: ./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
INFO:paramiko.transport:Connected (version 2.0, client libssh_0.8.1)
definitelyarealCTF{totally_a_REAL_flag}
자신의 CTF를 위해 이 챌린지 버전을 사용하려면, Dockerfile을 변경하여 기본 제공 경로가 아닌 다른 경로를 사용하고, flag.txt의 플래그를 변경한 다음(단, 여전히 한 줄이어야 함), 이미지를 다시 빌드하는 것이 좋습니다. 각 연결 시도마다 새 컨테이너를 호스팅해야 할 수도 있습니다. 이는 누군가가 파괴적인 명령을 실행하여 모든 참가자에게 영향을 미치는 것을 방지하기 위함입니다.
새 플래그로 docker 이미지를 다시 빌드하려면(그리고 테스트하려면)
flag.txt를 새 플래그로 업데이트하세요./build_run <image name>[:<version number] <port number> 명령을 실행하세요./libsshauthbypass.py 또는 직접 작성한 스크립트를 사용하여 올바른 페이로드와 실행하려는 명령으로 컨테이너에 접속하세요build_run 스크립트가 제공하는 셸에서 exit하면 컨테이너가 종료되고 삭제되지만, 이미지는 남아 있으며 <image name>으로 태그가 지정됩니다.개념 증명: https://youtu.be/ELrOBm02ANg
챌린지 풀이 https://youtu.be/Ii121piSZR0