대상 웹사이트에서

 

인증 우회하려고하는 대상에 해당되는 함수찾을때.

또한 우회 코드 힌트를 얻을때.

 

 

- F12 개발자도구 - Element 메뉴로 소스코드 찾기

- 해당 웹사이트의 전체 소스코드가 있는 데서 찾기

- 우회하려고하는 대상이 있는 페이지에서 페이지 소스에서 찾기

- 대상이 있는 페이지에서 해당 동작 행하며 관련 소스코드, 함수 얻기

(글쓰기 권한을 우회하고 싶으면 [글쓰기] 버튼을 클릭할때 관련된 소스코드를 개발자도구로 알아내기)  

- 일반 아이디 하나 가입해서 그걸로 여러 관련 페이지들 돌아다니며 그곳들의 소스코드에서 찾기?

(로그인 전과 로그인 후의 소스코드가 다를 수 있다.) 

 

lea 명령어와 mov 명령어 비교

[어셈블리어]

global main

section .text 
main: 
        mov     eax, 1 
        mov     ebx, 4 
        mov     ecx, 7 
        lea       eax, [eax+ecx] 
        lea       ebx, [ebx*4] 
        mov     eax, [eax+ecx]

 

 

- lea 명령어는 [ ] 대괄호 안의 값(여기서는 연산값)을 상수값으로 레지스터로 그대로 전달한다.

lea       eax, [eax+ecx]   결과.

 

<eax 값 출력>          

                               (16진수)  (10진수)

info reg $eax     :           0x8          8

 

 

lea       ebx, [ebx*4]   결과. 

 

<ebx 값 출력>

                               (16진수)  (10진수)

info reg $ebx     :           0x10         16

 

 

- mov 명령어는 [ ] 대괄호 안의 값(여기서는 연산값)을 주소값으로 보고 그 주소값에 있는 값을 레지스터로 전달한다.

mov     eax, [eax+ecx]   결과.

 

<ecx 값 출력>                 

info reg $ecx     :        

[ ] 대괄호 안의 값은 eax+ecx 즉, 8+7 = 15  16진수로 F다.

이를 주소형식으로 표현하면 0x0000000F 가 되는데

이 0x0000000F 주소값에 있는 값을 레지스터(ecx)로 전달하게 된다는 말이다.

 

하지만, 이 주소는 의미없는 주소이고 접근할 수 없는 주소다. 그래서 값이 제대로 출력되지 않는다.

 

 

and, or, xor 명령어

[어셈블리어]

global main

section .text
main:
        mov     eax, 0x33
        mov     ebx, 0x55
        mov     ecx, 0x42

        and     eax, ebx
        or       eax, ecx
        xor     eax, 0xac 

 

(16진수)         (2진수)

  0x33          00110011 

  0x55          01010101

  0x42          01000010

  0xac          10101100

 

 

and      eax, ebx   결과.

 

<eax 값 출력>         

                               (16진수)     (10진수)

info reg $eax     :           0x11          17

 

   00110011      (eax)

& 01010101      (ebx) 

   00010001          ->     17 (10진수)    0x11 (16진수)

 

 

 

 

or      eax, ecx   결과.

 

<eax 값 출력>         

                               (16진수)     (10진수)

info reg $eax     :           0x53          83

 

   00010001      (eax)

|  01000010      (ecx) 

   01010011          ->     83 (10진수)    0x53 (16진수)

 

 

 

 

xor      eax, 0xac   결과.

 

<eax 값 출력>         

                               (16진수)     (10진수)

info reg $eax     :           0xff          255

 

   01010011      (eax)

^ 10101100      (0xac) 

   11111111         ->     255 (10진수)    0xff (16진수)

 

 

 

'Reverse Engineering > gdb' 카테고리의 다른 글

gdb) 레지스터 값, 메모리값 확인 명령어  (0) 2020.11.20
sub, add 명령어  (0) 2020.10.10
gdb - Segmentation Fault, 대괄호 [ ]  (0) 2020.10.07
gdb 명령어, 리틀엔디언 방식  (0) 2020.10.07
gdb 실행, 명령어  (0) 2020.10.07

sub 명령어

[어셈블리 코드]

main:

            mov      eax,  esp                                    (1)

            sub       esp,  8                                        (2)

            mov      [eax],  dword 1                          (3)

            mov      [eax-4],  dword 2                       (4)

            sub       [eax-4],  dword 1                       (5)

 

[스택 주소]

(시작)

 

high

 

bffff0a0                       <-  esp                     처음엔 esp가 최상단 주소를 가리키고 있음.

bffff09c

bffff098

 

low

 

 

(1)        mov      eax,  esp   

 

high

 

bffff0a0                       <-  esp                     

                                 <-  eax                      esp가 가리키는 주소를 eax에도 할당.

bffff09c

bffff098

 

low

 

 

(2)        sub       esp,  8

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                       sub 명령어를 통해 esp가 가리키는 주소를 8만큼 내린다(빼준다).

                                         (즉, 주소 공간을 2개 만큼 아래로 확보한다는 말? 각 주소는 4크기 만큼의 차이가 있다.)

low

 

 

(3)        mov      [eax],  dword 1

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff0a0   :         0x00000001                           eax가 가리키는 주소에 1 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 할당한 것.)

 

 

(4)        mov      [eax-4],  dword 2

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff09c   :         0x00000002                eax가 가리키는 주소(bffff0a0)에 4 만큼 뺀(내려간) 주소(bffff09c)에 2 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 2값을 할당한 것.)

 

 

(5)        sub       [eax-4],  dword 1 

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff09c   :         0x00000001       

 

                                    eax가 가리키는 주소에 4 만큼 뺀(내려간) 주소(bffff09c)의 값(0x00000002)에서 1만큼을 sub

                                   (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 뺸 것.)

 

 

add 명령어

[어셈블리 코드]

main:

            mov      eax,  esp                                    (1)

            add       esp,  8                                        (2)

            mov      [eax],  dword 1                          (3)

            mov      [eax+4],  dword 2                       (4)

            add       [eax+4],  dword 1                       (5)

 

[스택 주소]

(시작)

 

high

 

bffff0a8

bffff0a4

bffff0a0                       <-  esp                     처음엔 esp가 최상단 주소를 가리키고 있음.

bffff09c

bffff098

 

low

 

 

(1)        mov      eax,  esp   

 

high

 

bffff0a8

bffff0a4

bffff0a0                       <-  esp                     

                                 <-  eax                      esp가 가리키는 주소를 eax에도 할당.

bffff09c

bffff098

 

low

 

 

(2)        add       esp,  8

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                               

 

low

 

 

                                             add 명령어를 통해 esp가 가리키는 주소를 8만큼 올린다(더한다).

                                            (즉, 주소 공간을 2개 만큼 위로 확보한다는 말? 각 주소는 4크기 만큼의 차이가 있다.)

 

 

(3)        mov      [eax],  dword 1

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                            

 

low

 

 

<주소값 출력>

bffff0a0   :         0x00000001                           eax가 가리키는 주소에 1 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 할당한 것.)

 

 

(4)        mov      [eax+4],  dword 2

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                       

 

low

 

 

<주소값 출력>

bffff0a4   :         0x00000002             eax가 가리키는 주소(bffff0a0)에 4 만큼 더한(올라간) 주소(bffff0a4)에 2 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 2값을 할당한 것.)

 

 

(5)        add       [eax+4],  dword 1 

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                      

 

low

 

 

<주소값 출력>

bffff0a4   :         0x00000001       

 

                                eax가 가리키는 주소에 4 만큼 더한(올라간) 주소(bffff0a4)의 값(0x00000002)에서 1만큼을 add

                                   (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 더한 것.)

 

 

 

 

 

Lame은 Hack The Box에서 제공되는 모의해킹을 위해 만들어진 취약 환경이다.

 

Lame의 목표는 Root 권한을 획득하는 것이며, 또한 이 권한을 이용해 플래그를 획득하는 것이 목표이다.

 

 

침투 환경 세팅

Kali Linux

 

칼리 리눅스는 고급 침투 테스트 및 보안 감사의 목적으로 만들어진 데비안 기반 리눅스 배포판으로 매년 3번씩 릴리즈 된다. 이 환경에는 침투 테스트, 보안 연구, 디지털 포렌식, 리버싱과 같은 다양한 정보보안 작업에 적합한 수백가지의 도구가 포함되어 있다.

 

Lame의 침투 테스트를 위해 이 칼리 리눅스를 활용하려한다.

 

 

 

네트워크 스캔

 

해당 취약 환경은 이미 IP 주소( 10.10.10.3 )가 Hack The Box 사이트에 알려져 있는 관계로

해당 IP 주소로 바로 스캔을 진행하려한다.

 

 

 

스캔 도구로 Nmap을 사용한다.

 

Nmap은 네트워크 검색 및 보안 감사를 위한 무료 오픈소스 유틸리티로 네트워크에서 사용 가능한 호스트, 호스트가 제공하는 서비스, 실행중인 운영체제, 패킷 필터/방화벽 유형을 알아낼 수 있다.

 

Nmap의 다양한 옵션은 

아래 링크에서 확인해 볼 수 있다. 여기서는 사용하는 옵션에 대해서만 설명하려 한다.

 

https://svn.nmap.org/nmap/docs/nmap.usage.txt

 

 

 

 

먼저, 다음 명령을 사용하여 우리가 스캔할 대상의 기본적인 정보를 얻는다.

sudo nmap -sV -O -F -Pn 10.10.10.3

 

nmap 옵션
-sV 열린 포트를 조사하여 서비스/버전 정보 확인
-O OS 식별
-F 빠른 스캔 모드. 기본 스캔보다 적은 수의 포트를 스캔
-Pn 서버가 살아있는 것으로 가정하고 바로 포트 스캔 시도
10.10.10.3 Lame 환경 IP주소

 

 

기본 스캔을 통해, 해당 취약 환경의 열려있는 포트 그리고 OS 환경, 버전 등을 확인할 수 있었다.

 

리눅스 기반의 환경이며 21번 포트(ftp), 22번 포트(ssh), 139번 포트(samba), 445포트(samba)가 열려있다.

 

 

 

 

기본적인 정보를 확인하였으니, 이제 더욱 상세한 스캔을 진행하기 위해 아래 명령을 수행한다.

sudo nmap -A -v -Pn 10.10.10.3

 

nmap 옵션
-A OS 감지, 버전 감지, 스크립트 스캔
& traceroute(추적 경로) 활성화
-v 스캔 내용을 더 자세히 출력
(더 상세한 출력을 위해 옵션을 -vv, -vvv 까지 높일 수 있다.)
-Pn  서버가 살아있는 것으로 가정하고 바로 포트스캔 시도

 

 

취약점 공격

취약한 FTP

 

열려있는 포트 중 21번 포트 FTP의 취약점을 확인하려한다.

 

searchsploit을 사용하여 vsftpd 2.3.4 알려진 취약점이 있는지 확인한다.

 

 

Searchsploit은 Exploit-DB용 명령줄(command line) 검색 도구이다. 로컬 환경에서 명령줄 검색을 통해 Exploit-DB에 저장된 취약점들을 검색할 수 있다.

 

(Exploit-DB는 침투 테스터 및 취약점 연구자가 사용하도록 만들어진 공개된 취약점, 소프트웨어 취약점들의 모음 사이트이다.

 

알려진 공격코드가 지속적으로 업데이트되며 간단한 형태의 스크립트 형태의 코드, 메타스플로잇 모듈로 만든 코드 등 여러 플랫폼과 언어별로 존재한다. 칼리 리눅스에 Exploit DB에서 제공하는 취약점 코드가 내장되어 있다.)

 

 

 

 

vsftpd 2.3.4 취약점을 검색하기 위해 다음 명령을 사용한다.

sudo searchsploit vsftpd 2.3.4

 

 

Backdoor Command Execution 취약점을 발견하였다.

 

 

 

해당 취약점을 Metasploit를 활용해 침투해보겠다.

 

Metasploit Framework는 버퍼 오버플로우, 패스워드 취약점, 웹 응용 취약점, 데이터베이스, 와이파이 취약점 등에 대한 약 300개 이상의 공격 모듈을 가지고 있는 오픈 소스 도구로서, 이 도구를 이용하면 저렴한 비용으로 기업의 시스템에 대한 포괄적인 침투 테스트을 통한 취약성을 파악할 수 있다.

 

 

 

Metasploit는 Kali Linux 환경에 기본적으로 구성되어 있으므로 해당 침투환경에서 바로 실행하여 진행하겠다.

 

먼저, 칼리 리눅스에서 Metasploit Framework를 실행해 주고

 

 

 

아래 명령어를 통해 Metasploit 내에서 vsftpd 2.3.4 취약점 공격도구 Backdoor Command Execution를 검색한다.

search vsftpd 2.3.4

 

exploit/unix/ftp/svftpd_234_backdoor가 검색된다.

 

 

 

우리는 이 공격을 이용하여 침투해보려 한다.

 

 

 

해당 공격을 사용하기 위해 아래 명령을 입력한다.

use exploit/unix/ftp/vsftpd_234_backdoor

 

 

 

이어서,

 

show options 명령을 통해 공격을 위해 필요한 옵션을 확인한다.

show options

 

아직 원격 호스트(RHOSTS)가 설정되지 않았음을 알 수 있다. 

 

 

 

공격을 실행하려면 이 원격 호스트 설정이 필요하므로 우리의 타겟인 10.10.10.3 Lame의 IP를 입력해준다.

set RHOSTS 10.10.10.3

 

 

 

그리고 공격을 진행한다.

exploit

 

공격이 완료되었다고 하지만 세션이 연결되지 않는다.

 

해당 공격의 취약점이 패치가 된 것으로 예상된다.

 

 

 

취약한 Samba

 

또 다른 취약점을 찾아보기 위해 열려있는 포트를 확인해 보았다.

 

445포트가 열려있는 것을 보고 해당 포트에서 사용하고 있는 Samba 3.0.20 버전에 취약점이 있는지 알아보려한다.

 

 

 

이번에도 searchsploit을 이용하여 취약점을 검색한다.

sudo searchsploit samba 3.0.20

 

 

samba 3.0.20과 관련된 'Username' map script Command Exection 취약점이 존재하는 것을 알아내었다.

 

 

 

 

취약점 공격을 사용하기위해 Metasploit Framework를 이용하겠다.

 

아래 명령을 통해 samba 3.0.20 취약점을 검색한다. 

search samba 3.0.20

 

14번째에 samba "username map script 취약점 공격이 있는 것을 확인했다.

 

 

exploit/multi/samba/usermap_script 공격을 사용하고

공격 타겟(10.10.10.3)을 설정해준 뒤

 

 

 

공격을 진행한다.

공격이 진행되고 세션이 연결된다.

 

 

 

명령 셸이 열려있고,

 

또한 whoami 명령어로 root 권한을 가지고 있음을 알아냈다.

whoami

 

 

 

하지만,

단순 리버스 셸(Reverse Shell)로 작업을 이어간다면 여러가지 불편함이 많으므로

 

 

파이썬으로 pty모듈을 생성하여 배시 셸(Bash Shell)로 연결한다면 더 수월하게 진행할 수 있다.

아래 명령을 통해 진행한다.

python -c "import pty; pty.spawn('/bin/bash)'"

 

pty는 유사 터미널을 위한 모듈이다. pty.spawn('/bin/bash')의 의미는 배시 셸 프로세스를 스폰하여 시작하고, 해당 프로세스의 제어 터미널의 표준 입출력을 현재 파이썬 프로세스의 표준 입출력과 연결한다는 말이다.

즉, 파이썬 프로세스 안에서 새로운 배시(Bash)를 실행하고 그것의 입출력을 파이썬이 실행중인 터미널에 그대로 노출하게 되는 것이다.

 

 

 

 

이어서,

 

 

/root 디렉터리에서 root.txt를

 

 

/home/makis 경로에서 user.txt를 찾아내는 데에 성공했다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NESSUS는 상용 취약점 스캐너이다.

 

 

 

NESSUS는 개인이 이용할 경우 제한된 기능의 무료 버전으로 사용할 수 있고 기업에서 사용시 모든 기능이 사용 가능한 유료 버전으로도 사용가능하다.

 

 

https://www.tenable.com/downloads/nessus?loginAttempted=true

위 사이트로 가면 nessus의 여러 운영체제 버전들을 다운 받을 수 있는데

 

 

칼리리눅스에서 사용하기 위해서는 debian 버전을 받아야한다.

칼리리눅스의 x32 x64 버전에 맞춰서 다운받아 준다.

 

 

그리고 activation code가 필요한데 다운로드 사이트 맨위에

get activaton code가 있다.

 

 

접속 후 오른쪽 register 버튼을 클릭하여 가입 하면 이메일로 코드가 날라온다. 이를 저장해 둔다.

 

 

설치 시 칼리리눅스 터미널에서 다운받은 deb 파일 경로로 가

 

sudo chmod a+x Nessus... 다운받은 파일에 실행권한을 준다.

그 후 sudo dpkg -i Nessus... 다운받은 파일을 풀어준다.

 

 

그 후 터미널에 나온 /bin/systemctl/ start nessusd.service 이 구문을 복사해

명령어를 실행해준다.

( sudo /opt/nessus/sbin/nessus-service 로 바뀐듯?)

 

다음 https://kali:8834/ 라고 나온 부분을 복사하여 웹브라우저에서 접속한다.

 

 

서큐리티 통제가 뜨는데 무시하고 접속한다.

essential로 해서 continue

 

 

다음은 skip (코드를 받는 과정인데 이미 받았으니 스킵)

 

 

그 다음 코드를 넣어주고 continue

 

 

계정명과 비밀번호를 원하는대로 넣고 접속하면 플러그인이 설치된다.

 

 

플러그인 설치 완료 후 계정명과 비밀번호로 접속한다.

 

 

 

gdb 명령어) 

 

PUSH : 스택에 데이터를 삽입

 

ex) push word

     push dword

     push word

 

• push 명령어는 자동으로 ESP를 4 바이트 감소 시킴

 

 

 

POP : 스택에서 데이터를 꺼냄(현재 위치한 스택인듯?)

 

ex) pop eax

     pop ebx

 

• 스택에서 4 바이트를 꺼내와 지정한 레지스터에 삽입

• pop 명령어는 자동으로 ESP를 4 바이트 증가 시킴

 

 

 

 

Segmentation Fault

이 프로그램( a.out )을 실행하면 어떤 결과가 나올까요? Segmentation Fault

 

 

Segmentation Fault

 

• 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 잘못된 방법으로 메모리 영역에 접근을 시도할 경우 발생한다.

 

 

발생 이유)

 

프로그래머가 생각하지 못한 사용자 입력값이 있었다?

• 그냥 프로그램을 잘못 짰다

• 프로그램에 문제가 있다는 의미

 

 

즉, 끝맽음을 제대로 하지 않은 것이다.

 

프로그램의 끝은 시스템 콜을 이용해야 함.

 

 

 

시스템 콜

<system calls list>

 

 

system calls list에 의하면,

 

eax 에 들어가는 값 1이 함수 코드번호이고 1번은 exit함수를 뜻한다.

ebx 에 들어가는 값 0은 인자로 들어가는 값이다.

 

즉, C언어 코드로 해석하면 exit(0)란 의미이다.

따라서 프로그램을 종료하겠다는 의미가 된다.

 

 

결국 이 프로그램( a.out )이 이제는 정상적으로 종료된다.

 

 

 

 

대괄호 [ ]의 사용.

 

어셈블리언어에서 대괄호( [ ] )는 포인터를 의미한다. 즉, 해당 값이 가리키는 주소를 의미한다.

 

 

위 코드에서의 사용 예를 보면,

mov      dword  [ebx],   0x10

 

16진수 0x10이라는 값을 ebx가 가리키는 주소에 4바이트 크기(dword)의 공간에다 넣어라. 하는 의미가 된다.

'Reverse Engineering > gdb' 카테고리의 다른 글

lea, and, or, xor 명령어  (0) 2020.10.10
sub, add 명령어  (0) 2020.10.10
gdb 명령어, 리틀엔디언 방식  (0) 2020.10.07
gdb 실행, 명령어  (0) 2020.10.07
gdb at&t 방식을 intel 방식으로 바꾸기  (0) 2020.10.07

+ Recent posts