<Level 20 - Level 21>
이번에도 홈 디렉터리에 setuid 바이너리 파일이 있다고 한다.
얘는 특정 포트로 연결해주는 역할을 한다고 한다.
suconnect를 실행해주니 사용 방법을 알려준다.
1. 우선, localhost 의 임의의 포트로 old 비밀번호를 보내고
2. suconnect 를 통해 그 포트로 연결을 해주면 된다.
nc 로 포트 번호를 지정해 비밀 번호를 보내준다.
nc [호스트명 / IP 주소]
-l : Listen 모드로 포트를 띄움. -> 접속, 연결 대기 상태
-p: 포트 번호를 지정.
// 백그라운드에서 1번 작업을 진행하며 2번 명령을 해줘야 하므로 라인 맨 뒤에 '&'를 붙여준다.
<Level 21 - Level 22>
/etc/cron.d/ 경로의 cronjob_bandit22 내용을 출력.
/usr/bin/cronjob_bandit22.sh을 실행하는 cron 이다.
/usr/bin/cronjob_bandit22.sh 가 뭐 하는 애인지 보니,
/tmp 아래 디렉터리의 권한을 바꿔서 거기다가 다음 비밀번호를 복사하는 명령을 하는 애다.
복사된 파일을 읽어주면 된다.
<Level 22 - Level 23>
얘도 크론 문제.
cronjob_bandit23은 /usr/bin/cronjob_bandit23.sh을 실행하는 애다.
/usr/bin/cronjob_bandit23.sh은 어떤 애인지 보면,
whoami -> 내가 로그인한 사용자 이름
md5sum: 무결성 확인하는 명령어. 해시값 같은 느낌...
cut [파일] (-d 구분자: 구분자를 기준으로 자름. / -f 필드: 잘라낼 필드 지정.)
여기서 myname은 bandit23가 된다.
mytarget은 "I am user bandit23"를 md5sum으로 변환한 값을 ' ' 구분자로 자른 상태에서 1번째 필드가 된다.
그리고 /etc/bandit_pass/bandit22에 있는 비밀 번호를 /tmp/mytarget으로 복사해주는 명령을 한다.
명령을 그대로 실행해서 mytarget이 뭔지 알아내고, 그걸 출력하면 된다.
<Level 23 - Level 24>
크론 문제.
NOTE 1) 직접 셸 스크립트를 작성해야 한다.
NOTE 2) 셸 스크립트는 한 번 실행되면 바로 지워지니까, 복사본을 만들어두는 게 좋을 거다.
cronjob_bandit24는 /usr/bin/cronjob_bandit24.sh를 실행하는 애다.
열어 보니 명령어가 주르륵 있다.
myname은 bandit24가 된다.
1. /var/spool/bandit24로 디렉터리 이동
2. "Executing and deleting all scripts in /var/spool/bandit24" 출력
3. . 디렉터리나 .. 디렉터리가 아닌 모든 파일에 대해서(for i in * .*)
Handling [파일명] 출력
파일 소유자 이름을 owner에 저장
파일 소유자가 bandit23이면 이때 파일 종료
아니라면, 파일을 삭제
...을 실행한다.
아무튼 /var/spool/bandit24에 있는 파일을 다 삭제할 모양이다.(bandit23 소유 파일 빼고...)
셸 스크립트를 써야 하는데...
일단 디렉토리를 만들어야 한다.
(사실 여러 번 시도하느라 원래 쓰던 디렉터리명이 다 중복으로 떠서... 이름도 이상하게 지었다...)
vi 편집기로 새 파일을 만들어서 이렇게 입력해주면 된다.
line 1은 셸이니까... 막줄은 비밀번호를 내 디렉터리의 새 파일에 복사해주는 명령어다.
/*
이건 문제가 안 되는데... 자꾸 셸 스크립트 저장하려고 할 때 권한이 없어 거부 당하는 거 때문에 애먹었다...
ㅠ.ㅠ 하... 여러 경우에서 다 해봤는데 아직 모르겠다...
umask 값은 다 같은데... 왜 때문에......
*/
그리고 접근 권한을 지정해줘야 한다.
셸 스크립트에만 777을 줬더니 안 되더라
디렉토리까지 777을 줘야 돌아간다.
/tmp/mydir24 안에 새로운 파일을 써줘야 해서 그런 듯하다.(/tmp/mydir24/pass.txt)
그리고 이 셸 스크립트를 /var/spool/bandit24/ 안에 넣어준다.
크론이 돌아가면서 이 셸 스크립트도 실행할 거고... 그러면 비밀 번호가 내가 지정한 pass.txt 에 복사될 거다.
-> 길어봤자 1분 내에 삭제될 파일이기 때문에 시간 내에 cat으로 확인해 줘야 한다.
잘 복사가 됐다...
몇 번인지 기억 안 나는데 압축 문제 이후로 제일 열 받는다.
<Level 24 - Level 25>
30002 포트에서 데몬이 listen 상태이다.
여기에 이전 단계 비밀번호 + 4자리 비밀번호를 주면 다음 단계 비밀번호를 준댄다.
4자리 비밀번호는 힌트는 없고, 가능한 경우의 수를 다 때려넣는 방식으로 해야 한다.(brute-forcing)
nc로 포트에 접속해보니, 공백으로 구분지어서 이전 단계 비밀번호 + 4자리 비밀번호를 입력하라고 한다.
틀리면 Wrong! --- 이 뜨고 다시 입력을 대기한다.
1. 입력으로 넣어줄 애들을 txt 파일로 만들 거다 -> 셸 스크립트를 이용해서
2. 만들어준 txt 파일을 nc로 30002 포트에 보내줄 거다.
먼저 입력 txt 파일을 만들기 위해 디렉터리 생성 후 그 안에 셸 스크립트를 작성하면...
셸 스크립트 실행 전 chmod로 777 권한을 줘야 한다.
셸 스크립트를 실행하주면 이렇게 input.txt 파일이 생긴다.
확인 차 한 번 출력해주면,
// 엄청나게 주르륵 라인이 뜰 거다...
0000부터 떠야 하는데 밀려서 사라졌다. 아무튼 제대로 만들어졌다.
이제 1번을 해결한 거다...
얘를 이제 nc로 30002 포트에 보내 주자.
// 또 엄청나게 주르륵 라인이 뜰 거다...
이러하다...
이러다가 얘가 맞는 번호를 찾으면
다음 비밀번호를 뱉는다.
<Level 25 - Level 26>
bandit26의 셸은 /bin/bash가 아닌 다른 곳에 있다고 한다.
일단 들어가서 보니,
bandit26의 sshkey가 있다. private 키가 있으면 비밀번호가 필요하지 않으니 접속을 시도해 보면,
.
.
.
되는 듯 하다가 갑자기 연결이 끊긴다.
어떤 셸을 쓰는지 아는 게 중요할 것 같다.
/etc/passwd 파일에는 사용자 정보가 저장돼 있다. (계정명, UID, GID, 홈 디렉토리, 로그인 셸) -> 비밀번호도 아주 예전에 여기에 저장했다고 하는데, 보안 문제로 지금은 /etc/shadow에 따로 저장한다.
=> 로그인 셸...!을 알면 될 것 같다.
bandit26의 정보만 출력하도록 grep으로 이어주면 이렇게 출력이 된다.
순서대로 계정명:비밀번호(x로 출력):UID:GID:comment:홈 디렉터리:로그인 셸 을 의미한다.
로그인 셸이 /usr/bin/showtext 군.
얘는 more...을 쓴다는 게 엄청난 힌트가 된다.
more의 기능 중에 v를 쓰면 vi 입력기로 전환되는 게 있는데... 그걸 써야 한다.
일단 more은 페이지 단위로 뜨니까 창을 작게 해두고...
이 상태에서 v를 누르면
vi 편집기로 들어왔다.
맨 밑의 커맨드 라인에
: set shell=[경로] 를 입력해주면, 셸이 바뀐다.
그리고 : shell 를 해주면, bandit26으로 진입된다.
<Level 26 - Level 27>
bandit27-do가 있다...
실행해보니, 전의 문제랑 같은 것 같다.
<Level 27 - Level 28>
ssh://bandit27-git@localhost/home/bandit27-git/repo 에 git 레포지토리가 있다고 한다.
bandit27와 bandit27-git은 비밀 번호가 같다고 한다.
레포지토리를 clone 해서 비밀 번호를 얻어야 하나 보다...?
git clone [저장소 URL] -> git 저장소를 복제해온다.
새 디렉터리를 만들어 저장소를 clone 해오면 된다.
repo 라는 디렉터리가 새로 생겼다.
들어가서 보니, README에 비밀 번호가 있다.
<Level 28 - Level 29>
오잉 문제가 같다...
똑같이 디렉터리 만들어 clone 해주고 뜯어보니 README가 있긴 있는데 수상하게 생겼다...
ASCII 텍스트 파일이어서 확인해보니
비밀 번호가 가려져 있다.
원래 있던 git에 commit한 내용을 보면 비밀 번호 나옴.
해당 디렉터리에서
git log -> commit한 내역을 볼 수 있다.
-p 옵션을 주면 상세하게 각 commit의 diff 결과를 보여준다.
.
.
.
<Level 29 - Level 30>
위 문제랑 같이 새 디렉터리를 만들어서 git clone을 해준다.
password가 가려져 있는 것도 아니고, 애초에 없었다고 한다...
git branch에 대해서 알아야 한다...
git branch -> commit한 여러 가지를 볼 수 있음.
-v: 로컬 branch의 정보 + 마지막 commit 내역
-r: remote branch 정보
로컬에는 master밖에 없는데 얘는 지금 내가 가지고 있는 버전이다.
리모트 브랜치를 보면 여러 개가 있다.
이중 orgin/dev를 불러와줄 거다.
브랜치를 가져오려면 git checkout의 -b 옵션을 쓰면 된다.
찾아보니, checkout 말고 요즘은 switch / restore 을 쓴다는데 업데이트를 안 해서 그런지... checkout 만 먹힌다.
아무튼
git checkout -b [브랜치명] [가져올 브랜치명]
dev라는 이름으로 orgin/dev 브랜치로 전환해줬다.
이 브랜치에도 README.md가 있다.
읽어보면, 비밀 번호가
'System Hacking > OverTheWire' 카테고리의 다른 글
OverTheWire Bandit 30 - 34 (0) | 2022.07.06 |
---|---|
OvertheWire Bandit 10 - 20 (0) | 2022.07.02 |
OverTheWire Bandit 0 - 10 (0) | 2022.07.01 |