이번엔 윈도우 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

제목과 같이 오늘은 파이썬을 사용해서 키로거를 제작을 한번 해볼려고 합니다.

 

단, 단순히 개인적인 공부목적으로 활용하는것이고 악의적인 의도는 없습니다.

(코드를 보면 간단해서 알 수 있을겁니다)

 

이제 키로거를 한번 만들어볼텐데 일단 그럼 키로거가 뭔지는 알아야겠죠?

 

Key Logger 키로거란?

컴퓨터가 받아들이는 입력 정보의 기록, 주로 키보드를 통한 입력의 데이터를 중간에 가로채는 해킹을 말한다.

대개 사용자의 동의 없이 기록을 만들고 전송하는 방식의 크래킹 도구로 쓰인다.

 

따라서 공격자가 피해자의 컴퓨터에 몰래 심어놓고 피해자의 컴퓨터에 키보드 입력을 받는다면 공격자는 

피해자의 컴퓨터의 암호를 쉽게 알 수 있겠죠? 

 

한번 키로거를 제작을 해보고 분석하는 것으로 진행해보려고 합니다 .

제목에서도 알 수 있듯이 파이썬을 사용해야하니, 관련 모듈을 한번 보겠습니다. 

 

Pynput

pynput 이란, 키보드와 마우스를 제어할 수 있는 파이썬 라이브러리이다.

이 라이브러리를 통해 키보드와 마우스 입력을 하고, 리스너 등록을 통해 키보드와 마우스로부터 들어오는

값을 가져올 수도 있다. 

 

그렇다면 Pynput 라이브러리를 통해서 키보드를 제어한다고 가정하면 키로거를 만들 수 있을거 같습니다.

한번 설치를 해보겠습니다, 

pip install pynput

 

 

이제 설치를 완료하였으니 키보드로 입력을 받아오는 코드를 작성해보도록 합시다. 

from pynput import keyboard // pynput 라이브러리 

def keyPressed(key): // 키보드 입력 받아오기
    print(str(key))
    with open("keyfile.txt",'a') as logkey: // 키로그를 Keyfile.txt 파일에 저장
        try:
            char =key.char
            logkey.write(char)
        except:
            print("Error getting char")

if __name__ == "__main__":
    listener = keyboard.Listener(on_press=keyPressed)
    listener.start()
    input()

 

실행을 시켜주면??

 

문자열로 facebook을 입력했을때 각각의 문자를 정확하게 받아오고 특수키가 'Enter' 같은 것들이 입력이 되었을때는 

특수키가 입력이 된것으로 잘 받아오고 있습니다.

이것으로 잘 돌아가는 것을 알 수 있습니다. 

 

이번에 포스팅할 내용은 제목과 같이 리눅스환경에서 어셈블리어를 사용할건데요

Ubuntu에서 nano 에디터를 사용하여 다음과 같이 코드를 작성했습니다.

파일명은 test.s로 작성했습니다. 

section .data
	msg db "Hello world"
section .text
	global _start
    
_start:
	mov rax, 1 ; 문자열을 읽어오기 
    mov rdi, 1 ; 문자열을 출력
    mov rsi, msg ; Hello world 저장
    mov rdx, 12 ; Hello world를 출력할 수 있도록 문자열 길이를 만들어줌 
    syscall ; printf("Hello world");
    mov rax, 60 ; exit
    mov rsi, 0 
    syscall

 

우분투에서 코드작성을 하였고 64bit 운영체제라서 64bit 어셈블리로 작성했습니다.

이제 nasm 어셈블리 컴파일러를 통해서 목적 파일로 만든 후 실행을 해보도록 하겠습니다.

nasm -f elf64 -o 파일명.o 파일명.s 
ld -o 실행파일명 파일명.o

 

앞서 test.s 로 파일을 생성했기 때문에 편하게 알아볼 수 있도록 다음과 같이 하였습니다.

이렇게  컴파일을 하면 실행파일이 하나 생길겁니다.

nasm -f elf64 -o test.o test.s
ld -o test test.o

 

생성된걸 확인 할 수 있습니다.

test 실행파일 생성

이제 실행을 해보면? 

실행 후 화면

아주 멀쩡하게 실행이 잘 됩니다. 

오늘은 리눅스에서 어셈블리어로 코딩을 하는방법을 알아보았습니다.

다음 포스팅에서는 앞전에 있었던 내용들을 전부 활용해서 조금 더 어셈블리를 심화적으로 다뤄보도록 하겠습니다.

'Theory > Pwnable' 카테고리의 다른 글

찬희의 포너블 기초 Stack Overflow 2  (0) 2021.09.29
찬희의 포너블 기초 Stack Overflow 1  (0) 2021.09.29
Shellcode list  (0) 2021.09.26
Pwn tools 소개 2  (0) 2021.09.22
Pwntools 소개 1  (0) 2021.09.14

포렌식에 대해서 여러가지 포스팅을 하고 있습니다만 

 

여러가지 기타 다른 정보들도 열람하시려면 아래 노션 참고해주시면 될거 같습니다

 

그렇다고 노션에만 작성을 하는것은 아니구요 

 

블로그 포스팅은 계속 하겠습니다

 

https://www.notion.so/Digital-Forensic-11cc85273c5f450ba4aed1d8cb77cb2b

확장 파티션 - Extended Partition 

원래 하나의 MBR은 64byte라서 구조상 4개의 파티션을 사용할 수 밖에 없는데 

그 한계를 극복하기 위해서 나온 개념입니다. 

 

마지막 4번째 파치션 테이블이 가리키는 위치가 또 다른 MBR영역을 가리켜 추가로 4개의 

파티션을 담을 수 있도록 하는 구조라는 것이죠

 

 

파티션을 사용하는 이유는 

시스템 파티션과 구분하여서 데이터 저장이나 백업용으로 사용을 많이 합니디.

하나의 시스템에 다양한 운영체제를 설치(멀티 부팅)를 할 수 있다는 장점도 존재하며,

파일 탐색 시에 헤드 움직임 감소로 탐색시간이 줄어드는 장점도 존재하기 때문에 

이러한 장점들로 인하여 확장 파티션을 현재까지도 쓰고 있습니다. 

 

이상 확장파티션에 대해서 한번 알아보았습니다.

이번에는 저번 외전편에 이어서 조금더 자세하게 알아보도록 하겠습니다. 

파티션 

저장메체의 저장공간을 논리적으로 분할한것으로 

시스템은 부팅과정에서 파티션의 크기, 위치, 설치된 운영체제등을 파악하여 그에 맞게

구동을 해야 하는데, 그러한 정보를 담고 있는 부분이 Boot Record(BR) 영역이라고 합니다. 

우리가 자주 사용하는 Windows는 파티션의 첫번째 섹터에 위치를 하고 있습니디.

 

 

여러개의 파티션을 나누어서 포멧을 하면 다중 파티션을 만들수도 있고 

파티션을 하나만 사용을해서 단일 파티션을 만들 수도 있습니다. 

 

하지만 대부분 파티션 별로 주로 포멧도 하고 하는경우가 많아서 

파티션에 따라서 파티션을 관리하는 MBR 영역이 있습니다. 

 

Master Boot Record

분할된 파티션에서의 각 BR을 관리하는 영역으로 

MBR은 저장메체의 첫번째 섹터 (LBA 0)에 위치하는 512byte 크기의 영역 입니다.

정리를 하자면 파티션에 관한 정보를 담고있는 BR영역을 총괄하는 영역이 MBR영역 입니다.

 

예를 들어 아래의 다중 파티션 같은경우 파티션의 총 갯수에 대한 정보는 MBR이 가지고

각 파티션마다 C:\ / D:\ 에 대한 정보들은 각각의 BR영역이 가지게 됩니다. 

 

 

Boot code 

컴퓨터가 부팅이 될때 수행되는 코드로 파티션 테이블에서 부팅 가능한 파티션을 찾아서 

해당 파티션의 부트 섹터를 호출하는 역할을 수행합니다.

아래의 그림을 보면 현재 MBR은 4개의 파티션 영역을 관리할 수 있다는 이야기가 됩니다.

 

Partition Table Area - 파티션 테이블 영역 

16byte씩 총4개의 파티션 정보가 저장 됩니다. 

첫번째 값인 부트 플래그(Boot Flag)는 해당 파타션이 부팅가능한 파티션인지를 나타내면서

부팅가능한 파티션일 경우 해당 부트 플래그의 값은 0x80 입니다.

 

MBR의 부트코드는 파티션 테이블을 검색하여 부트 플래그 값이 0x80의 값을 가지고 있는 

파티션의 부트섹터 위치로 점프하는 역할을 수행하게 됩니다. 

그래야 부팅이 되겠죠??

 

그래서 포렌식 수사 시, 파티션 영역 및 디스크의 전 영역을 조사하거나 

필요에 따라서 MBR의 영역을 직접해석하는 경우도 있습니다. 

(그러니까 나쁜짓 하면 안되요)

 

 

여기까지 MBR 영역을 한번 알아보았는데요

원래는 MBR영역에서 파티션 정보를 표현하는 공간은 총 64byte로 총 4개까지만 

파티션을 분할 할 수 있지만 실제로 해보면 더 많은 공간의 파티션을 분할 할 수 있습니다.

바로 확장 파티션이라는 개념이 등장한 것인데요,

 

다음 포스팅에서는 이것을 한번 알아보도록 하겠습니다.

이번에는 파티션과 볼륨을 한번 간단하게 알아보도록 하겠습니다. 

우선 파티션이 뭘까요?

 

Partition

말 그대로 분리를 하는것 입니다. 

물리적으로 연속된 섹터들의 집합을 의미하고

디스크의 공간을 논리적인 별도의 데이터 영역으로 분할한 공간을 의미합니다.

 

Volume 

논리적으로 연속된 섹터들의 집합입니다.

파일시스템으로 포멧된 디스크 상의 저장 영역, 볼륨에는 드라이브 문자가 할당 됩니다.

(C드라이브 , D드라이브 등등 많이 보있을 겁니다.)

 

단일 하드 디스크에 여러개의 볼륨이 존재 할 수 있으며 -> (C드라이브 , D드라이브 등등)

여러개의 하드디스크가 하나의 볼륨이 될수도 있습니다 -> (대표적으로 RAID가 있겠네요)

 

파티션과 약간 다르죠?

파티션은 그냥 하나의 공간일 뿐입니다.

포멧을 시키면 그 곳에 파일시스템이 만들어지면서 완성되면 볼륨이 생성됩니다.

 

즉, 하드디스크를 파티션으로 공간을 나누어서 포멧을 하면 여러개의 볼륨이 생기게 되는데

여러개의 하드디스크를 하나로 묶어서 포멧을 한다면 여러개의 하드디스크를 사용을 할 지라도 

하나의 볼륨으로 생성이 됩니다. 

 

파티션과는 다른 개념입니다. 

 

이번에는 Slack에 대해서 알아보도록 하겠습니다. 

Slack Space 

물리적인 구조와 논리적인 구조의 차이로 발생하는 낭비공간 입니다. 

쉽게 말해서 파일에 할당된 공간이지만 사용되자 않는 낭비 공간 입니다.

 

 

 

RAM Slack (Sector Slack)

저장되어있는 데이터가 디스크에 저장될 때 512byte씩 기록되는 특성 때문에 발

생하는 공간입니다. 그래서 다른 말로 섹터 슬랙이라고도 합니다. 

지정되는 파일의 크기가 항상 512byte의 배수가 아니기 때문에 이럴 경우 발생하게 됩니다. 

여분의 바이트 값으로 0x00으로 기록이되고 램 슬랙을 이용하면 파일의 끝 부분을 알 수 있기 때문에 

삭제된 파일의 복구시에 유용하게 사용되기도 합니다. 

 

실제로 파일 카빙에 활용을 많이 합니다. 

메타 데이터 보다는 파일 자체의 바이너리 데이터 (내용이나 시그니처, 헤더)등을 이용해서 

메타 데이터 영역이 아닌 할당되지 않은 비 할당 영역에서 파일을 복구하는 형식을 의미합니다.

 

File Slack(Drive Slack)

클러스터에서는 사용하고 있으나 사용되지않은 불필요한 공간 입니다. 

그래서 램슬랙은 섹터 내부였다면 파일 슬랙은 클러스터 내부에서 발생하는 낭비 공간입니다.

 

파일 슬랙을 이용하면 특정 파일이 해당 저장 매체에 존재하였는지 규명이 가능합니다,

존재 여부를 알아야 할 파일들을 클러스터 단위로 나눈 후  각 클러스터의 마지막 부분과 파일 슬랙 중 

일치하는 부분이 있는지 확인을 합니다. 

 

최하단의 디스크 입출력은 섹터 단위로 진행이 되기 때문에 0x00으로 기록되는 램슬랙과는 다르게 이전의 

데이터가 그래도 남아있습니다.(I/O는 섹터 단위로 진행)

이전에 사용한 데이터가 존재 할 경우, 흔적 조사에 활용을 할 수 있을 것입니다.

 

 

 

File System Slack 

파일시스템 할당 크기와 볼륨크기간의 차이로 인해서 발생디는 공간을 의미합니다.

1,026KB 볼륨에 4KB 클러스터 사용하는 파일시스템을 구성하게 된다면

마지막 2KB는 파일 시스템 슬랙이 됩니다. 

 

 

Volume Slack 

전체 볼륨 크기와 할당된 파티션 크기의 차이로 인해서 발생되는 공간 입니다. 

하나의 볼륨에 파티션이 있는데 파티션이 안나누어져 있는 공간을 의미합니다. 

파티션의 공간과 볼륨의 남은 공간이 딱 맞지 않은 경우에 볼륨슬랙이 생기게 됩니다.

 

이번에는 슬랙영역에 대해서 알아보았는데 다음 포스팅에서는 파티션과 MBR 에 대해서 

알아보도록 하겠습니다.

+ Recent posts