바이너리의 소스코드를 "잘" 이해 해 보고, 실행 인자값을 "잘" 줘봅시다.
필요한 사전지식
1. C언어와 힌트로 제공된 소스코드에 대한 구체적인 이해
2. 명령줄(Command Line)에서 공백을 인자값으로 전달하는 방법
3. 동시에 여러개의 명령어를 실행하는 방법
level4 유저 권한을 가진 파일을 찾아줍시다.
실행 해 보면, 힌트로 제공된 소스코드에서 인자값이 제공되지 않았을 경우와 동일하게 출력된다는 것을 알 수 있습니다.
소스코드의 1 ~ 13 line까지는 맞는 것 같네요.
그럼, 인자값을 dig 명령 사용에 맞아 떨어지도록 줘봅시다.
잘 실행되네요.
힌트로 보여줬던 소스코드중, 취약한 구조를 가진 로직은 아래와 같습니다.
이 구조는, level4의 권한을 가지고
"dig @" + 사용자가 전달한 인자값 + " version.bind chaos txt"
라는 명령 문자열을 만들어낸 뒤, 조건과 검증없이 실행하게 됩니다.
이런 구조라면, 사용자가 전달한 인자값에 명령어가 포함될 경우 그 명령어 또한 같이 실행하게 될 것 입니다.
그럼, "사용자가 전달한 인자값"에 명령어를 추가 해 봅시다.
echo test라는 명령은 전달되지 않은 것 같습니다.
사용자가 전달하는 인자값은, 띄어쓰기(space)로 구분이 됩니다.
그런데 더블쿼터(")로 묶어서 전달하면 띄어쓰기도 함께 전달됩니다.
POSIX IEEE Std 1003.2 알아보기 -> https://pubs.opengroup.org/onlinepubs/009656399/toc.pdf
그럼, 이제 더블쿼터로 묶어서 전달 해 봅시다.
잘 들어가는 것으로 확인됩니다.
그럼, 이제 "echo test" 문자열을 명령어로 인식하게 만들 경우 우리가 원하는 명령어를 실행할 수 있게 됩니다.
인자값이었던 "8.8.8.8 echo test" 문자열을 좀 더 튜닝 해 봅시다.
여러개의 명령어를 실행시키는 방법은, 아래와 같이 &&를 붙여주면 됩니다.
GNU Bash 메뉴얼 알아보기 -> https://www.gnu.org/software/bash/manual/bash.html#Lists
그럼, "8.8.8.8 && echo test" 문자열을 인자값으로 던져봅시다.
동작을 하긴 하는데, 중간에 Ctrl + C로 끊어줘야 합니다.
원래 동작 원형 자체가 dig + ~인 구조라서, dig 명령이 끝나야 echo 명령을 실행시키는 것 같습니다.
그럼 뭐 어떻습니까? ㅎㅎ 우리는 이미 echo 명령을 실행시켰네요.
그럼, 뒤에 bash 쉘을 실행시키는 명령을 넣어봅시다.
"bash version.bind chaos txt"라고 실행시켜서 문제가 발생하는 것 같으니, bash 뒤에 있는 문자열은 무시하게 하면 bash 쉘을 실행한뒤 bash쉘을 탈출하게 될 경우 version.bind를 실행하게 될 것 입니다.
그럼 level4 권한으로 bash쉘을 실행하게 됩니다.
권한 확인하고, level4에 있는 my-pass 명령을 실행시키기 위해 현재 디렉토리를 변경 해 줍니다.
비밀번호는 suck my brain이네요.
'Wargame > Hacker School FTZ' 카테고리의 다른 글
HackerSchool FTZ - Level6 (0) | 2015.11.21 |
---|---|
HackerSchool FTZ - Level5 (0) | 2015.11.21 |
HackerSchool FTZ - Level4 (0) | 2015.11.21 |
HackerSchool FTZ - Level2 (0) | 2015.11.21 |
HackerSchool FTZ - Level1 (0) | 2015.11.21 |