반응형

이번에는 리눅스 폴더 구조에 대해서 알아보는 시간을 갖고자 합니다.


리눅스 폴더는 기본적으로 역 Tree 구조로 되어 있습니다. 


root (/)라고 하는 파일시스템에 Tree 형태로 구조화되어 있습니다. 


리눅스는 기본적으로 모든 자원 (프로세스, 하드웨어, 네트워크 등등)을 파일로서 다루기 때문에 


기본적인 디렉토리 구조를 알고 있다면 추후 리눅스 관련 업무를 하는데 도움이 될 수 있다 생각합니다.


(PS. 물론 시간이 ... 약이기는 하죠)


그렇다면 기본적인 폴더 구조를 보고 각각의 폴더가 어떤 역할을 하는지 알아보도록 하겠습니다


root@choi:/# tree -L 1 -d

.

├── bin

├── boot

├── cdrom

├── dev

├── etc

├── home

├── lib

├── lib64

├── lost+found

├── media

├── mnt

├── opt

├── proc

├── root

├── run

├── sbin

├── snap

├── srv

├── sys

├── tmp

├── usr

└── var

 


지금 보시는 내용은 tree 라는 명령어를 이용해서 제가 사용하는 폴더 구조를 보고 계십니다. 일단 중요한 내용 부터 시작해서 각각의 폴더 역할에 대해서 알아보도록 하겠습니다.


1) proc 

가상 파일 시스템입니다. 이 디렉토리의 내용들은 시스템에서 운영되고 있는 다양한 프로세서들에 대한 내용과 프로그램에 대한 정보를 포함 하고 있습니다. 이 디렉토리에서 볼수 있는 내용은 실제 드라이브에는 저장되어 있지 않고 메모리 상에 저장되어 있습니다. 또한 다양한 정보 (CPU, Memory, Disk 등등)를 포함하고 있습니다.


2) sbin

시스템 관리를 위한 전반적인 실행 유틸리티를 담고 있습니다. 이 디렉토리에 있는 명령어들은 매우 위험도가 높기 때문에 일반사용자는 사용할 수 없으며 오직 root 권한만 실행 가능합니다.


3) bin

기본적인 실행 파일(ls, cat, echo ...)들이 모여있습니다. 


4) dev

디바이스 드라이버들이 모여 있습니다. 이것들은 시스템 디바이스나 자원들을 접근하는데 사용합니다


5) etc 

시스템의 부팅, 셧다운시에 필요한 파일들과 시스템 전반에 걸친 설정 파일, 초기 스크립트 파일, 일부 애플리케이션의 설정 파일들이 있는 디렉토리 입니다.  시스템 전체 환경에 관한 설정을 바꾸기 위해서 이 디렉토리에 대한 이해가 필수적으로 필요합니다 

(* 추후 심화 Reporting)


6) sys

proc 과 유사한 가상파일 시스템입니다. 이 부분은 초기 리눅스에서는 없었으나 커널이 점점 커지고 내용이 많아지면서 등장하게 되었습니다. 기본적으로는 시스템 전반을 모니터링 하고 일부 커널 파라미터의 설정을 바꾸기위해 사용 됩니다.


7) boot 

환경 설정 파일을 제외한 부팅과정에서 필요한 모든 구성요소들이 포함 되어 있습니다. (UEFI 모드)


8) lib/lib64

부팅과 시스템 운영에 필요한 공유 라이브러리와 커널 모듈이 위치합니다.


반응형
반응형



이번에는 리눅스 베포판에 대해서 알아보고 리눅스 베포판 동향에 대해서 알아보겠습니다.


리눅스 베포판에서 가장 많은 점유율을 갖고 있는 것은 Ubuntu, Mint, Red Hat, Fedora, Gentoo, Debian, OpenSUSE가 있습니다.


먼저 Ubuntu는 가장 대중적으로 많이 사용하고 있는 배포판입니다. 가장 많이 사용하게 된 원인은 저의 개인적인 생각이지만 구글에서 안드로이드의 개발 기본 플랫폼으로 사용하게 되면서 많은 오픈 소스에서 레퍼런스로 사용하고 있습니다. 또한 우분투는 기본이 되는 Unity Ubuntu, LUbuntu, XUbuntu, KUbuntu 등 다양한 버전의 Ubuntu가 개발되고 사용되고 있으며 각자 개인의 입맛에 맞게 사용하고 있습니다. 그리고 Ubuntu는 개발자들이 많이 선호하는 베포판인 만큼 최신 버젼의 소스 코드를 유지하고 있습니다


다음은 Mint 입니다. 그림에서는 '악당같은' 이란 표현이 되어 있습니다. Mint는 악당같이 Ubuntu의 장점을 취합해서 만든 베포판 입니다. Mint는 Ubuntu의 가장 큰 단점이 었던 '무거움'을 많이 해결 했지만 아직... Ubuntu와 같이 대중성 확보하고 있지 않습니다.


Debian은 앞서 이야기 했던 Ubuntu와 Mint의 아버지 뻘 되는 베포판 입니다. 흔히 리눅스 베포판을 Debian 계열, Red Hat 계열로 나누게 되는 만큼 Debian은 역사와 전통이 있는 데포판입니다. 그만큼 안정성에서는 타의 추종을 불허 하지만 보수적인 성격 탓에 최신 버젼의 소스를 반영하는데 부정적입니다.


다음은 Red hat과 Cent OS입니다. Red hat은 Cent OS와 같은 베포판을 갖고 있습니다. 둘의 차이점은 유료와 무료라는데 있습니다. 또한 Red Hat은 기업에서 운영하는 만큼 운영체제외에 다른 소프트웨어를 묶어서 솔루션을 제공하는 점이 핵심 입니다.


반응형
반응형

이번에는 gdb를 통해서 각종 정보를 확인 하는 방법을 알아보자 


(gdb) info register


(gdb) run

Starting program: /home/choi/bash


Breakpoint 1, 0x0000555555583db0 in main ()

(gdb) info registers

rax            0x555555583db0   93824992427440

rbx            0x0      0

rcx            0x555555623420   93824993080352

rdx            0x7fffffffe4d8   140737488348376

rsi            0x7fffffffe4c8   140737488348360

rdi            0x1      1

rbp            0x555555623420   0x555555623420 <__libc_csu_init>

rsp            0x7fffffffe3e8   0x7fffffffe3e8

r8             0x7ffff79a2d80   140737347464576

r9             0x7ffff79a2d80   140737347464576

r10            0x2      2

r11            0x3      3

r12            0x555555585520   93824992433440

r13            0x7fffffffe4c0   140737488348352

r14            0x0      0

r15            0x0      0

rip            0x555555583db0   0x555555583db0 <main>

eflags         0x246    [ PF ZF IF ]

cs             0x33     51

ss             0x2b     43

ds             0x0      0

es             0x0      0

fs             0x0      0

gs             0x0      0

(gdb) 


현재 함수를 호출한 함수와 호출시 전달된 인자에 대한 정보를 담고 있는 스택 트레이스도 출력할수 있다. 스택 트레이스를 확인하면 함수 호출 내역을 끝까지 역추적할 수 있다. 


(gdb) info stack

(gdb) info stack

#0  0x0000555555583db0 in main () 


(gdb) x/5x $rip

gdb에서 가장 쓰임이 많은 명령어 x를 사용했다. x는 메모리값을 출력하는 명령으로 메모리, 지역 변수, 기타 실행 파일의 저장된 다양한 정보를 보여줍니다.

/5x라는 인자를 사용했는데 그 의미는 5개의 주소 값을 0x로 표현되는 16진수로 출력하는 명령어 입니다.

(gdb) x/5x $rip

0x555555583db0 <main>:  0x56415741      0x54415541      0x81485355      0x000128ec

0x555555583dc0 <main+16>:       0x247c8900

(gdb) x/5x $rsp

0x7fffffffe3e8: 0xf75d7b97      0x00007fff      0x00000001      0x00000000

0x7fffffffe3f8: 0xffffe4c8 



반응형
반응형

GDB는 리눅스에서 개발시 디버깅을 하기 위한 기본적인 도구 입니다. 보통은 실행될 바이너리에 자기 자신을 직접 attach 한다. 다시말해 GDB는 바이너리가 실행되는 동안 자세한 정보를 관할 수 있도록 바이너리를 특수한 위치 시킨다. 테스팅 목적으로 포함 되는 디버깅 정보를 이용하면 프로그램의 의미를 좀더 쉽게 이해 할 수 있습니다. 그렇지만 대부분의 바이너리은 디버깅 플래그를 설정 하지 않고 컴파일 된것이 기 때문에 이를 이용해서 더비깅 해서 리버싱을 하는 방법도 알아 두면 좋을 것 같습니다.


gdb [바이너리]


gdb ./bash


choi@choi:~$ gdb ./bash

GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git

Copyright (C) 2018 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

Find the GDB manual and other documentation resources online at:

<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".

Type "apropos word" to search for commands related to "word"...

Reading symbols from ./bash...(no debugging symbols found)...done.

(gdb)  


run 명령을 명령을 이용해 실행 파일 인자를 지정할 수 있습니다.

(gdb) run --version

Starting program: /home/choi/bash --version

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

Copyright (C) 2016 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>


This is free software; you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.

[Inferior 1 (process 13232) exited normally]

(gdb)


브레이킹 포인트를 설정하기 위해서는 우선 해당 코드의 주소를 알아야 되어야 한다.


우선 main 함수의 주소를 알기 위해서는 dissaemble main을 이용하거나 objdump를 이용하면 됩니다.


(gdb) run --version

Starting program: /home/choi/bash --version

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

Copyright (C) 2016 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>


This is free software; you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.

[Inferior 1 (process 13232) exited normally]

(gdb)


choi@choi:~$ objdump --disassemble-all --start-address=0x000000  ./bash |grep \<main*Base\>
000000000002fdb0 <main@@Base>:


다음으로 해당 주소에 브레이크주소를 거는 방법을 보도록 합니다.


(gdb) b main

Breakpoint 2 at 0x2fdb0

(gdb) b *0x000000000002fdb0

Note: breakpoint 2 also set at pc 0x2fdb0.

Breakpoint 3 at 0x2fdb0


또한 watch point를 사용하여 특정변수에 대한 감시를 할 수 있다.


(gdb)  eval "watch -location *0x%x", $rsp

Hardware watchpoint 4: -location *0xffffe3e8


반응형
반응형

리버스 엔지니어링은 모든 보안 분야에서 중요한 부분입니다.

컴파일된 실행 파일을 리버스 엔지니어링 하는 작업에서 가장 중요한 단계 중 하나는 디스어셈블링입니다. 

디스어셈블링은 코드 컴파일 과정을 최대한 거꾸로 복원하는 작업이다. 


objdump는 디스어셈블링에 가장 유용한 도구 중 하나입니다.

objdump의 다양한 실행 옵션을 사용해서 ELF (Executable and Linkable Format, 실행 및 링크 가능 포맷) 바이너리의 다양한 섹션 정보를 추출이 가능


※ ELF  (Executable and Linkable Format, 실행 및 링크 가능 포맷) 

→ ELF는 실행 파일, 공유 라이브러리, 리눅스/유닉스 시스템용 오브젝트 파일 등을 기술하는 파일 형식이다


objdump -D bash : -D 옵션을 지정하면 바이너리를 디스어셈블링 한 후 그 결과 값을 화면에 출력한다.


root@choi:/home/choi# objdump -D bash |more


bash:     file format elf64-x86-64


Disassembly of section .interp:


0000000000000238 <.interp>:

 238:   2f                      (bad)

 239:   6c                      insb   (%dx),%es:(%rdi)

 23a:   69 62 36 34 2f 6c 64    imul   $0x646c2f34,0x36(%rdx),%esp

 241:   2d 6c 69 6e 75          sub    $0x756e696c,%eax

 246:   78 2d                   js     275 <_init@@Base-0x2bba3>

 248:   78 38                   js     282 <_init@@Base-0x2bb96>

 24a:   36 2d 36 34 2e 73       ss sub $0x732e3436,%eax

 250:   6f                      outsl  %ds:(%rsi),(%dx)

 251:   2e 32 00                xor    %cs:(%rax),%al


Disassembly of section .note.ABI-tag:


0000000000000254 <.note.ABI-tag>:

 254:   04 00                   add    $0x0,%al

 256:   00 00                   add    %al,(%rax)

 258:   10 00                   adc    %al,(%rax)

 25a:   00 00                   add    %al,(%rax)

 25c:   01 00                   add    %eax,(%rax)

 25e:   00 00                   add    %al,(%rax)

 260:   47                      rex.RXB

 261:   4e 55                   rex.WRX push %rbp

 263:   00 00                   add    %al,(%rax)

 265:   00 00                   add    %al,(%rax)

 267:   00 03                   add    %al,(%rbx)

 269:   00 00                   add    %al,(%rax)

 26b:   00 02                   add    %al,(%rdx)

 26d:   00 00                   add    %al,(%rax)

 26f:   00 00                   add    %al,(%rax)

 271:   00 00                   add    %al,(%rax)

        ...


Disassembly of section .note.gnu.build-id:


0000000000000274 <.note.gnu.build-id>:

 274:   04 00                   add    $0x0,%al

 276:   00 00                   add    %al,(%rax)

 278:   14 00                   adc    $0x0,%al 


기본으로 실행했을 때 디스어셈블링은 끝이다. 하지만 다양한 옵션을 통해서 재미있는 분석이 가능하다


objdump -j [섹션명] -D [바이너리]


이 옵션을 사용하게 되면 원하는 섹션 정보만을 추출 해서 볼 수 있다.


root@choi:/home/choi# objdump -j .interp -D bash


bash:     file format elf64-x86-64



Disassembly of section .interp:


0000000000000238 <.interp>:

 238:   2f                      (bad)

 239:   6c                      insb   (%dx),%es:(%rdi)

 23a:   69 62 36 34 2f 6c 64    imul   $0x646c2f34,0x36(%rdx),%esp

 241:   2d 6c 69 6e 75          sub    $0x756e696c,%eax

 246:   78 2d                   js     275 <_init@@Base-0x2bba3>

 248:   78 38                   js     282 <_init@@Base-0x2bb96>

 24a:   36 2d 36 34 2e 73       ss sub $0x732e3436,%eax

 250:   6f                      outsl  %ds:(%rsi),(%dx)

 251:   2e 32 00                xor    %cs:(%rax),%al 


※ 특히 .text 세그먼트(섹션)에는 실행 코드가 들어 있으며 이 부분을 잘 분석하는 것이 리버스 엔지니어링의 시작이다.


반응형
반응형

메타스플로잇을 이용한 취약점 점검 하기 예제 


msf > use auxiliary/scanner/smb/smb_login

→ 사용할 모듈이나 익스플로잇을 선택


msf auxiliary(scanner/smb/smb_login) > show options

→ 사용할 모듈이나 익스플로잇의 설정가능한 옵션


Module options (auxiliary/scanner/smb/smb_login):


   Name              Current Setting  Required  Description

   ----              ---------------  --------  -----------

   ABORT_ON_LOCKOUT  false            yes       Abort the run when an account lockout is detected

   BLANK_PASSWORDS   false            no        Try blank passwords for all users

   BRUTEFORCE_SPEED  5                yes       How fast to bruteforce, from 0 to 5

   DB_ALL_CREDS      false            no        Try each user/password couple stored in the current database

   DB_ALL_PASS       false            no        Add all passwords in the current database to the list

   DB_ALL_USERS      false            no        Add all users in the current database to the list

   DETECT_ANY_AUTH   true             no        Enable detection of systems accepting any authentication

   PASS_FILE                          no        File containing passwords, one per line

   PRESERVE_DOMAINS  true             no        Respect a username that contains a domain name.

   Proxies                            no        A proxy chain of format type:host:port[,type:host:port][...]

   RECORD_GUEST      false            no        Record guest-privileged random logins to the database

   RHOSTS                             yes       The target address range or CIDR identifier

   RPORT             445              yes       The SMB service port (TCP)

   SMBDomain         .                no        The Windows domain to use for authentication

   SMBPass                            no        The password for the specified username

   SMBUser                            no        The username to authenticate as

   STOP_ON_SUCCESS   false            yes       Stop guessing when a credential works for a host

   THREADS           1                yes       The number of concurrent threads

   USERPASS_FILE                      no        File containing users and passwords separated by space, one pair per line

   USER_AS_PASS      false            no        Try the username as the password for all users

   USER_FILE                          no        File containing usernames, one per line

   VERBOSE           true             yes       Whether to print output for all attempts


msf auxiliary(scanner/smb/smb_login) > set RHOSTS 127.0.0.1

→ 특정 변수를 설정

RHOSTS => 127.0.0.1

msf auxiliary(scanner/smb/smb_login) > exploit

→  공격을 시작


[*] 127.0.0.1:445         - 127.0.0.1:445 - Starting SMB login bruteforce

[-] 127.0.0.1:445         - This system accepts authentication with any credentials, brute force is ineffective.

[*] Scanned 1 of 1 hosts (100% complete)

[*] Auxiliary module execution completed

msf auxiliary(scanner/smb/smb_login) >



반응형

+ Recent posts