sudo apt-get update
sudo apt-get install ssh
ssh -p 2220 bandit0@bandit.labs.overthewire.org
password : bandit0
*** ssh 나가는 명령어 : exit
cat readme
password : ZjLjTmM6FvvyRnrb2rfNWOZOTa6ip5If
ssh -p 2220 bandit1@bandit.labs.overthewire.org
# filename을 입력할 때는 파일 전체의 위치 경로를 지정해줘야 한다.
cat ./-dashed
password : 263JGJPfgU6LtdEvgfWU1XP5yac29mFx
ssh -p 2220 bandit2@bandit.labs.overthewire.org
# 파일 이름 안에 띄어쓰기가 있는 경우 ''로 묶거나 \를 쓰면 된다.
cat 'spaces in this filename' = cat spaces\ in\ this\ filename
password : MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx
ssh -p 2220 bandit3@bandit.labs.overthewire.org
cat ...Hiding-From-You
password : 2WmrDFRmJIq3IPxneAaMGhap0pFhF3NJ
ssh -p 2220 bandit4@bandit.labs.overthewire.org
file ./*
cat ./-file07
password : 4oQYVPkxZOOEOO5pTW81FB8j8lxXGUQw
ssh -p 2220 bandit5@bandit.labs.overthewire.org
ls -al ./*
cat maybehere07/.file2
password : HWasnPhtq9AVKe0dmk45nxy20cvUa6EG
정답:
find ./* -size 1033c
cat maybehere07/.file2
- find [경로] [수식]
[수식] : -size 숫자[bcwkMG]
# find ./* -size +N => N 이상 크기의 파일을 검색한다.
# find ./* -size -N => N 이하 크기의 파일을 검색한다.
# find ./* -size N => N 크기의 파일을 검색한다.
** 사이즈 단위 **
b : 블록단위
c : byte
k : kbyte
w : 2byte 워드
ssh -p 2220 bandit6@bandit.labs.overthewire.org
find ./* -size 33c -user bandit7 -group bandit6 2> /dev/null
cat ./var/lib/dpkg/info/bandit7.password
password : morbNTDkSW6jIlUc0ymOdMaLnOlFVAaj
ssh -p 2220 bandit7@bandit.labs.overthewire.org
grep 'millionth' data.txt
password : dfwvzFQi4mU0wfNbFOe9RoWskMLg7eEc
ssh -p 2220 bandit8@bandit.labs.overthewire.org
cat data.txt|sort|uniq -c
sort : 정렬
uniq : 중복 문자열 제거
-c : 중복 갯수 출력
password : 4CKMh1JI91bUIZZPXDqGanal4xvAg0JM
ssh -p 2220 bandit9@bandit.labs.overthewire.org
cat data.txt|strings | grep =
strings : 실행하는 파일의 출력가능한 문자들만 출력해주는 명령어
password : FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey
grep 했을 때 binary file matches 나올 때 해결 법
: text 파일로 인식하지 않고 Binary file로 인식해서 발생하는 오류
: 뒤에 -a 혹은 -text를 붙이면 된다.
ssh -p 2220 bandit10@bandit.labs.overthewire.org
base64 --decode data.txt
password : dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr
ssh -p 2220 bandit11@bandit.labs.overthewire.org
cat data.txt|tr "n-za-mN-ZA-M" "a-zA-Z"
tr : 변환해주는 명령어
n-za-m : n-z 다음에 a-m가 이어서 온다는 의미
password : 7x16WNeHIi5YkIhWsfFIqoognUTyj9Q4
ssh -p 2220 bandit12@bandit.labs.overthewire.org
이번 문제는 압축 해제와 아카이브 해제, 그에 맞는 확장자로 이름 변경 반복이다.
file로 파일의 형식 확인
- gzip 파일 > 확장자 .gz> gzip -d [파일명]
- bzip2 파일 > 확장자 .bz2 > bzip2 -d [파일명]
- POSIX tar archive (GNU) 파일 > tar -xvf [파일명]
password : FO5dwFsc0cbaIiH0h8J2eUks2vdTDwAn
ssh -p 2220 bandit13@bandit.labs.overthewire.org
ssh -i sshkey.private bandit14@localhost -p 2220
cd /etc/bandit_pass
cat bandit14
password : MU4VWeTyJk8ROof1qqmcBPaLh7lDCPvS
RSA private key를 이용한 접속
-> ssh -i RSA_KEY_PATH <사용자계정>@<remote-host> -p <포트번호>
ssh -p 2220 bandit14@bandit.labs.overthewire.org
nmap -sV 10.0.1.252
telnet 127.0.0.1 30000
password : 8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo


🔹 1. 30000번 포트에서 SSH 서비스가 아님
Nmap이 30000/tcp을 ndmps?라고 감지한다.
→ 이는 "NDMP(Network Data Management Protocol)" 또는 유사한 비-SSH 서비스가 동작 중일 가능성이 높다는 의미
따라서 이 포트는 단순히 "열려 있는(open)" TCP 포트일 뿐, SSH 데몬(sshd)이 바인딩되어 있지는 않다.
🔹 2. SSH 클라이언트는 프로토콜 handshake가 맞지 않으면 바로 종료
ssh는 서버와 접속 후 바로 SSH 프로토콜 핸드쉐이크를 시도한다.
그런데 30000번 포트에는 SSH가 없기 때문에, 그 핸드쉐이크에 올바른 응답을 못 받고 바로 연결을 닫아버림 → "Connection refused" 또는 "Connection closed" 메시지 발생
🔹 3. 반면 telnet은 단순한 TCP 연결만 수행
telnet은 단순히 "연결만" 한다.
→ 따라서 해당 포트가 열린 상태면 "Connected to 127.0.0.1"이 뜨고, 이후 수동으로 프로토콜을 주고받을 수 있다.
즉, telnet은 서비스 종류에 상관없이 연결만 되면 성공
ssh -p 2220 bandit15@bandit.labs.overthewire.org
openssl s_client -connect localhost:30001
8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo
password : kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx
s_client : SSL/TLS 를 사용하는 원격 호스트에 접속하기 위한 일반적인 SSL/TLS client를 구현하는 명령어
-> $openssl s_client -connect [서버]:[포트]
ssh -p 2220 bandit16@bandit.labs.overthewire.org
nmap -sV localhost -p31000-32000
openssl s_client -connect localhost:31790 -ign_eof
RSA PRIVATE KEY :
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
-----END RSA PRIVATE KEY-----


비root 사용자일 경우 netstat과 ss는 일부 포트를 보여주지 않기 때문에, 리스닝 중이어도 사용자 권한으론 확인이 안 되는 포트가 존재할 수 있다.
이 문제에서처럼 nmap은 외부에서 직접 포트에 연결을 시도해 보기 때문에, 시스템 권한에 관계없이 포트가 열려 있는지만 판단할 수 있다. 반면, netstat이나 ss 같은 로컬 도구는 운영체제 내부 정보를 참조하는데, 비root 사용자는 다른 사용자 또는 시스템 데몬이 열어둔 포트 정보 일부에 접근할 수 없다.
즉, 31790이 실제로 리스닝 중이더라도 그것이 루프백(127.0.0.1) 전용 포트이거나 root 또는 다른 사용자 소유의 프로세스가 열어둔 포트라면 netstat이나 ss로는 확인할 수 없고, nmap만이 이를 탐지할 수 있다.
이처럼 사용자 권한 제한이 걸려 있는 환경에서는 nmap이 가장 신뢰할 수 있는 포트 확인 도구다.



비밀번호를 입력하여 Credential을 받으려 했으나 KEYUPDATE만 나오고 진행이 되지 않는다. 검색을 해보니 openssl의 s_client에서 tls1.3부터는 "k" 혹은 "K"가 입력의 첫번째로 나왔을 경우 그것을 TLS명령으로 오판하여 EOF신호를 내보내 비밀번호를 입력할 수 없는 상황인 것 같다.
그래서 -ign_eof 옵션을 사용하여 EOF신호가 발생하더라도 이를 무시하고 입력한다.
RSA private key를 이용한 접속
-> ssh -i RSA_KEY_PATH <사용자계정>@<remote-host> -p <포트번호>
로컬로 나와서
vi bandit17_rsa_key에 rsa key를 넣어서 vi 파일 생성
chmod 600 bandit17_rsa_key
ssh -i bandit17_rsa_key bandit17@bandit.labs.overthewire.org -p 2220
diff passwords.new passwords.old
password : x2gLTTjFwMOhQ8oWNbMN362QKxfRqGlO / ktfgBvpMzWKR5ENj26IbLGSblgUG9CzB
처음 생성한 bandit17_rsa_key는 644 권한이다. 해당 키로 접속을 시도하면 아래와 같은 오류가 발생한다.

따라서 권한을 600으로 좁혀주고 다시 실행하면 정상적으로 접속이 가능하다.



이 문제의 경우 비밀번호를 입력하면 Bye Bye! 라고 뜨며 연결을 종료시켜 버린다.
때문에 접속할 때 뒤에 명령어를 입력하면 해당 명령어를 실행해주니 입력하고 비밀번호를 입력하여 다음 비밀번호를 얻는다.
ssh -p 2220 bandit18@bandit.labs.overthewire.org "cat readme"
password : cGWpMaKXVwDUNgPAVJbWYuGHVn9zl3j8
ssh -p 2220 bandit19@bandit.labs.overthewire.org
file bandit20-do
./bandit20-do cat /etc/bandit_pass/bandit20
password : 0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO

파일 실행할 때 : ./filename
euid는 일시적으로 파일 소유자의 권한을 얻게 되는 것
ssh -p 2220 bandit20@bandit.labs.overthewire.org
- 포트 여는 쪽
nc -l 7777(임의 포트 지정)
0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO
password : EeoULMCra2q0dSkYj561DX7s1CpBuOBt
- 접속 하는 쪽
./suconnect 7777
파일 분할 : tmux, screen
tmux 명령어:
- cmd 분할 : Ctrl + D (수평) / Ctrl + R (수직)

nc -l 옵션은 listen 상태로 포트를 open한다.
ssh -p 2220 bandit21@bandit.labs.overthewire.org
cd /etc/cron.d
cat cronjob_bandit22
cat /usr/bin/cronjob_bandit22.sh
cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
password : tRae0UfB9v0UzbCdn9cY0gQnds9GF58Q
크론(cron) : 특정 시간에 특정 작업을 하는 데몬
크론탭(crontab) : 크론을 시간을 설정해서 실행시키는 것
크론탭 주기 : * * * * * {실행 명령}
// 위 * 순서대로 분 시 일 월 요일 {실행 명령}
분 : 0-59
시 : 0-23
일 : 0-31
월 : 0-12
요일 : 0-6 (일-토 : 0과 7은 일요일이며 1부터 월요일)
* * * * * = 매 분마다 실행 = 1 * * * *
25,55 * * * * = 매 25분, 55분마다 실행
ssh -p 2220 bandit22@bandit.labs.overthewire.org
cd /etc/cron.d
cat cronjob_bandit23
cd /tmp
cd $(mktemp -d)
echo I am user bandit23 | md5sum | cut -d ' ' -f 1
cat /tmp/8ca319486bfbbc3663ea0fbe81326349
password : 0Zf11ioIjMVN551jX3CmStKLYqjk54Ga
ssh -p 2220 bandit23@bandit.labs.overthewire.org
cat /etc/cron.d/cronjob_bandit24
mkdir /tmp/waseoke
vi test.sh
#!/bin/bash
cat /etc/bandit_pass/bandit24 > /tmp/waseoke/test.txt
chmod 777 /tmp/waseoke/test.sh
chmod 777 /tmp/waseoke
cp test.sh /var/spool/bandit24/foo
cat /tmp/waseoke/test.txt
password : gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8
ssh -p 2220 bandit24@bandit.labs.overthewire.org
nc 10.0.1.252 30002를 하여 들어가보니 아래와 같은 텍스트가 뜬다.

이를 위해 tmp에서 0000 ~ 9999 숫자를 대입하는 쉘 스크립트를 작성한다.

생성된 password.txt를 30002포트에 대입하여 비밀번호를 알아낸다.
cat /tmp/waseoke/pass.txt | nc 10.0.1.252 30002

password : iCi86ttT4KSNe1armKiwbQNmB3YJP3q4
데몬 : 백그라운드 프로세스 중에서 부모프로세스(PPID)가 1 혹은 다른 데몬프로세스인 프로세스를 말한다.
데몬은 오래 사는 프로세스를 말하고, 보통은 시스템이 부팅될 때 같이 켜지고 종료될 때 같이 끝난다. Controlling 터미널이 없어서 background 에서 돈다 라고 표현한다.
유닉스(리눅스)에서는 데몬을 앞에 나타나지 않고 사용자가 모르게 뒤에서 시스템을 위해 움직이는 프로그램을 말한다.
리눅스에서 서버 역할을 하는 프로그램들을 대부분 데몬에 속한다.
데몬은 지속적인 서비스 요청을 처리하기 위해 백그라운드에서 계속 실행되는 프로세스를 말하며, 보통은 프로세스 뒤에 d 문자가 붙어있다.
유닉스(리눅스 포함) 운영체제에서 이름이 “d”로 끝나는 프로세스들을 예로 들자면 inetd, httpd, nfsd, sshd, named와 lpd 등이 있다.
처음엔 nc 대신 telnet을 사용했는데 시간 초과 때문인지 Wrong!으로 쭉 뜨다가 "Wrong! Please entConnection closed by foreign host." 라는 메시지를 끝으로 종료되었다.
ssh -p 2220 bandit25@bandit.labs.overthewire.org
more의 경우 cat과 다르게 한 페이지씩 보여준다.
따라서 프롬프트 창을 작게 하여 여러 페이지로 분할한 뒤 closed가 뜨지 않게 한다.
그 상태에서 v를 눌러 vi 모드로 진입하고 :e /etc/bandit_pass/bandit26으로 비밀번호를 알아낸다. (:e = echo)
password : s0773xxkk0MXfdqOfPRVr9L3jJBUOgCZ
그 후 shell을 /bin/bash로 지정하고 실행하여 우리가 알던 쉘 모드로 진입한다.
:set shell=/bin/bash
:shell
을 입력하면 bandit26 유저로 쉘 입력이 가능하다.

쉘은 사용자가 운영체제의 서비스를 사용할 수 있도록 사용자의 입력을 기반으로 프로그램을 실행해 주는 역할
커널은 쉘로부터 전달 받은 명령을 기계가 이해할 수 있는 언어로 변환하여 CPU, I/O, 메모리 등 다양한 리소스에 접근해 주는 역할
리눅스 쉘 종류

Level25에서 26을 진입한 상태로 시작한다. 제한 시간이 있기 때문에 빠르게 풀어야한다.
ls -al
file bandit27-do
./bandit27-do cat /etc/bandit_pass/bandit27
password : upsNCc7vzaRDx6oZC6GiR6ERwe1MowGB
ssh -p 2220 bandit27@bandit.labs.overthewire.org
git clone ssh://bandit27-git@localhost:[포트번호: 2220]/home/bandit27-git/repo
cat README
password : Yz9IpL0sBcCeuG7m9uQFt8ZNpS4HZRcN
ssh -p 2220 bandit28@bandit.labs.overthewire.org
git clone ssh://bandit28-git@localhost:2220/home/bandit28-git/repo
git log
git show 817e303aa6c2b207ea043c7bba1bb7575dc4ea73
password : 4pT1t5DENaYuqnqvadYs1oE4QLCdjmJ7
ssh -p 2220 bandit29@bandit.labs.overthewire.org
git clone ssh://bandit29-git@localhost:2220/home/bandit29-git/repo
git branch -r
git checkout dev
git log
git show 081ac380883f49b0d9dc76a82c53211ef7ba74b0
password : qp30ex3VLz5MDG1n91YowTv4Q8l7CDZL
ssh -p 2220 bandit30@bandit.labs.overthewire.org
git clone ssh://bandit30-git@localhost:2220/home/bandit30-git/repo
1번 풀이
git tag
git show secret
2번 풀이
git show-ref (-refs는 references의 줄임말로 마지막 커밋을 가리키고 그렇기 때문에 모든 개체를 조회할 수 있다.)
git show secret
password : fb5S2xb7bRyFmAvQYQGEqsbhVyJqhnDy
ssh -p 2220 bandit31@bandit.labs.overthewire.org
git clone ssh://bandit31-git@localhost:2220/home/bandit31-git/repo

vi key.txt -> May I come in? 입력하여 생성
git add .
git commit -m 'text'
git push origin master 를 하니 변경 사항이 없다면서 푸쉬가 되지 않았다.
gitignore을 살펴보니 .txt 확장자가 제외되어 있었다. 따라서 강제로 추가하여 푸쉬했다.
git add key.txt -f
git commit -m 'text'
git push origin master
password : 3O9RfhqyAlVBEZpVb6LYStshZoqoSx5K


ssh -p 2220 bandit32@bandit.labs.overthewire.org
$0은 명령행 인자로 셸스크립트의 이름을 담는다.
그러나 아무것도 없기 때문에 $0을 입력하면 >>이 $으로 변하면서 입력할 수 있는 상태가 된다.
$0
bash
id
cat /etc/bandit_pass/bandit33
password : tQdtbs5D5i2vJwkO8mEyYEyTL8izoeJ0
