Pwn/Bandit

    Level 23 → Level 24

    이번 문제는 저 스스로 shell-script를 작성해서 푸는 문제인가 보군요. 그리고 한번 실행하고 나면 삭제되니 남기고 싶으면(기념?) 복사해두라네요. ㅎㅎ 일단 이전 문제와 마찬가지로 기본적인 것들을 확인해봅시다. (/usr/bin으로 들어온 뒤) cat cronjob_bandit24.sh shell-script가 보입니다. 저희가 작성할 스크립트는 /var/spool/bandit24에 저장해야 합니다. (들어가서 확인해보세요.) if문 내의 조건을 조금 풀어보면은 for에서 전달받은 * .* 형식의 파일의 값을 $i로 나타내었고 이 값이 현재 경로(.) -a(&&) 이전 경로(..)가 아닐 때 아래를 실행하게 됩니다. ..............................................

    Level 22 → Level 23

    이전 문제와 비슷한 유형이군요. 일단 파일을 확인해봅시다. cat cronjob_bandit23 cat /usr/bin/cronjob_bandit23.sh 코드를 잘 봐야 하는 문제입니다. 하나하나 보도록 하죠. 일단 첫번째 줄은 고쳐지면 myname=bandit22 이 되겠군요. 두 번째 줄은 mytarget=$(echo I am user bandit22 | md5sum | cut -d ' ' -f 1) 실행시키면 바로 볼 수 있을 것이라 생각됩니다. 문제는 저희가 알아내야 할 비밀번호가 bandit22가 아닌 bandit23이라는 것입니다. 어떤 식으로 tmp의 경로를 지정하는지는 알아냈으니 숫자만 바꿔서 그대로 이용해봅시다. echo I am user bandit23 | md5sum | cut -d..

    Level 21 → Level 22

    이번에는 cron이라는 시간 기반 스케쥴러에 대해 다뤄보는 문제입니다. 문제에서 설명한 대로 /etc/cron.d/에 들어가서 확인해봅시다. 그리고 어떤 명령어가 실행되고 있는지까지 확인해보도록 하겠습니다. cd /etc/cron.d/; ls -l cat (3개의 파일들) 일단 형식을 살펴보도록 합시다. 별(*)이 5개인 것을 보니 이런 시간을 가지고 있습니다. 그리고 그다음에 오는 게 실행할 명령어인 것이죠. 매분마다 실행하고 있으니 잘 이용해봅시다. 저희는 현재 bandit22를 집중적으로 봐야 합니다. 그래서 위에서 가리킨 파일이 어떤지 먼저 확인해봤습니다. ls -l /usr/bin/cronjob_bandit22.sh bandit21의 권한이 있는 저희도 보고 실행할 수가 있군요. 내용은 이렇고요..

    Level 20 → Level 21

    ls -l 으로 먼저 확인해보니 다음과 같이 나타납니다. SetUID가 설정된 파일이 하나 나오는군요. 일단 그냥 써서 어떤 식으로 동작하는지 알아보도록 합시다. ./suconnect 인자로 port를 주면 localhost를 통해서 접속하여 현재의 비밀번호와 비교해 같으면 다음 level의 비밀번호를 전달해주는 것 같았습니다. 그럼 일단 nc 명령어로 localhost에서 9999 port를 열어줍시다. 그리고 해당 port로 접속하면 비교를 위한 현재의 비밀번호를 전달하도록 설정합시다. echo "GbKksEFF4yrVs6il55v6gwY5aVje5f0j" | nc -l localhost -p 9999 & (&: 리눅스 작업을 background에서 동작할 수 있게 합니다.) 그러고 나서 jobs 명..

    Level 19 → Level 20

    이번엔 setuid 문제입니다. 로그인을 하고 home 디렉터리의 파일의 권한을 확인해보니 ls -l bandit20의 실행 권한이 현재 s로 setuid로 설정된 것을 보실 수 있습니다. 이 권한(s)은 이 파일을 실행한 어떠한 유저라도 일시적으로 해당 파일의 소유자의 권한을 얻을 수 있습니다. 즉 우리가 노려할 것은 이 파일이 어떤 파일인지 알아본 뒤, bandit20의 권한을 일시적으로 얻었을 때에 /etc/bandit_pass/bandit20의 패스워드를 훔쳐보는 것입니다. 일단 그룹권한으로 현재 bandit19도 읽고 실행할 수 있으니 실행해 봅시다. ./bandit20-do 아하 인자를 하나 전달해서 실행하라고 하네요. 일단 예시 그대로 따라 실행해보도록 하겠습니다. ./bandit20-do ..

    Level 18 → Level 19

    이전 레벨에서 얻은 패스워드로 로그인을 시도해보겠습니다. ssh bandit18@localhost 하지만 웬일인지 바로 로그아웃되며 창이 닫히는군요... 당황스러웠지만 이전 레벨의 NOTE 부분을 보도록 합시다. see 'Byebye!'가 정확히 적혀있군요. 그리고 문제를 보니 로그인을 하려는 순간 .bashrc라는 파일이 실행되어 저희를 로그아웃 시키나 봅니다. 그래서 저는 ssh로 접속하라는 힌트라고 생각을 하고 어떻게 하면 ssh 명령어와 함께 이 문제를 풀 수 있을까를 생각해보았습니다. 그렇게 구글링을 하던 도중에 ssh 사용법 중 하나를 발견하게 되었습니다. 바로 ssh [사용자]@[서버] [명령어] 이렇게 사용할 수 있다는 것입니다. 바로 시도해보았습니다. 저희가 원하는 건 bandit18의 ..

    Level 17 → Level 18

    home 디렉터리에는 두 파일이 존재합니다. passwords.old와 passwords.new가 있습니다. 문제에서는 두 파일의 다른 점이 딱 한 줄 존재한다고 합니다. 그렇다면 저희가 이용할 수 있는 명령어인 diff가 있습니다. 이 명령어는 전달받은 두 파일 간의 차이점(difference)을 발견하고 결과를 출력해줍니다. 자세한 사용법은 여기를 참고하시길 바랍니다. diff passwords.old passwords.new 결과를 보면 .old에 있던 한 줄()을 볼 수 있습니다. 그렇다면 밑에 있는 것이 다음 레벨로 가기 위한 패스워드라는 것을 알 수 있습니다. 이제 다음 레벨로 로그인 해볼까요?

    Level 16 → Level 17

    이번에는 Port Scan에 대한 문제인가 봅니다. 어떤 port가 살아있는지 찾으라는 것 같습니다. 그래서 port scan을 하기 위한 명령어로 nmap을 써보도록 하겠습니다. 사용법과 옵션에 대한 내용은 여기를 참고하시길 바랍니다. nmap -p 31000-32000 localhost 열려있는 port가 3개 보이는군요. 문제에서도 말했듯이 열려있는 port들 중에서 ssl에 현재 패스워드를 넣었을 때 반응하는 곳은 '한 곳'밖에 존재하질 않는다고 합니다. 그렇다면 저희는 지난 일에 배운 것처럼 openssl s_client -connect localhost:[얻은 포트 중 하나] 을 이용해서 반응을 하는 포트를 보면 됩니다. 그리고 현재 패스워드를 제출해보시면 반응하는 한 포트가 있습니다. 그리고..

    Level 15 → Level 16

    힌트를 보니 이번 문제는 OpenSSL과 관련된 문제인 것 같습니다. 그래서 이 분 블로그를 참조해서 사용법을 좀 알아보았습니다. 아무래도 OpenSSL 1.0.1 ~ 1.0.1f 버전에서 발생하는 취약점인 것 같습니다. 그래서 먼저 openssl 명령어의 버전이 무엇인지 알아보았죠. openssl version -a 뭐죠 이건... 왜 1.1.0k 버전인 걸까요... 그래서 에라 모르겠다는 심정으로 그냥 정석대로 연결해보았습니다. openssl s_client -connect localhost:30001 이후 현재 비밀번호를 입력하고 결과를 보았습니다. ?????????????? 다른 블로그 분들의 풀이를 보았는데 원래라면 -ign_eof 옵션을 주지 않으면 답이 나오지 않았습니다. 게다가 애초에 He..