if md5sum(cmd) != whitelisted_hash: print(f'Invalid command, try "{whitelisted_cmd.decode()}"') continue
try: out = subprocess.check_output(['/bin/bash', '-c', cmd]) print(out.decode()) except subprocess.CalledProcessError as e: print(f'Command returned non-zero exit status {e.returncode}')
if __name__ == "__main__": main()
문제 스크립트에서 md5sum 함수를 살펴보면 3바이트만 리턴한다.
문제 풀이에 앞서 md5 collision에 대해 간단히 살펴봤다. md5는 같은 입력값이면 항상 같은 출력값이 나온다. 서로 다른 값을 입력할 경우 같은 출력값이 나올 확률은 굉장히 낮지만 같은 값이 나올 가능성이 존재한다. 예를 들면 AAAA와 BBBB의 md5를 적용했을 때 출력값이 같을 수도 있다는 의미이다. 이런 상황을 md5 collision이라고 한다.
문제 스크립트는 ‘echo lmao’를 md5sum 함수를 거친 후의 값과 같으면 입력값을 bash로 실행할 수 있다. 막막해보이지만 사실 md5sum 함수에서의 전체 해시값의 3바이트만 똑같은 입력값을 찾으면 된다.
Solve
나는 쉘을 획득하기 위해 bash #을 고정으로 두고 # 주석 뒤에 숫자를 적어줘서 브루트포싱으로 md5 해시가 3바이트만 똑같은 경우를 찾으려고 했고, 성공했다!