5/30/2018

Javascript를 이용하여 간단하게 카카오톡 공유(카카오링크) 적용하기

요즘은 SNS 공유 기능을 사용하지 않는 웹 페이지를 만나보기가 굉장히 어렵습니다. 특히나 블로그나 매체, 판매 사이트들은 컨텐츠의 공유에 있어 굉장히 좋은 방법이고 많이 사용되고 있기 떄문에 그렇다고 생각이 드네요.

이전부터 몇몇 sns 서비스에 대해서 공유버튼 사용하다가, 불필요한건 날리다가.. 여러번했었는데요. 최근에 그냥 google, twitter, facebook 정도만 유지하고 있었습니다. 

문뜩 카톡쪽도 추가하면 좋겠다는 생각이 들어 바로 적용했고 그 과정에 대한 내용 공유해봅니다. 
(템플릿을 지정할 수 있어서 글 공유 이외에 다른 용도로도 써볼 수 있을 것 같네요)

카카오 개발자 등록&어플리케이션 등록

다른 SNS 공유 기능(대체로 그냥 공유 페이지에 a 태그로 링크 거는게 전부죠..)과 다르게 개발자 등록 후 API 키를 받아서 처리해야합니다. 덕분에 통계 뽑아 보기에는 좋겠네요. 

우선 카카오 개발자 페이지(https://developers.kakao.com)로 접속하여 개발자 계정으로 가입(그냥 기존 톡 계정에서 몇몇 내용만 작성하면 끝) 후 어플리케이션을 생성해줍니다. 

그 후 기본정보에 들어가보시면 앱 키 정보를 확인할 수 있습니다. 저는 블로그에 공유 기능만 추가할거라 Javascript 키만 필요했습니다. 

사이트 도메인 지정 안하면 에러 납니다. 

그리고 위 이미지 아래쪽에 보시면 플랫폼 부분이 있는데, 여기서 Android, iOS, Web 여부와 허용할 서비스 지정이 필요합니다. 전 웹으로 하고 허용 서비스 공유가 사용되어도 좋은 서비스 도메인만 포함하였습니다. 

여기서 허용서비스가 아닌 곳에서 제  API 키를 가지고 공유하는 경우 ErrorCode(4002) 에러가 발생합니다. 

혹시라도 발생했다면 개발자 페이지에서 이런 부분들 우선적으로 확인해주시면 될 것 같습니다. 

자 이제 거의 다 끝나갑니다. 카카오 링크 코드가 복잡하진 않으니 아래 링크 참고하시면 금방 원하시는 대로 구성이 가능할겁니다.


코드 대충 주석 달아놨으니.. 추가로 더 참고해주시면 좋을듯해요.

<a href="javascript:;" id="kakao-link-btn"> 
<!-- 버튼이 생기는 부분, id는 맘대로 쓰시되 아래 js 코드도 동일하게 적용해주셔야 합니다. -->
<img src="//developers.kakao.com/assets/img/about/logos/kakaolink/kakaolink_btn_medium.png" /> <!-- 톡 이미지 부분이고, 전 kakaolink_btn_small.png로 불러왔습니다.   -->
</a>
<script type="text/javascript">
  //<![CDATA[
    // // 사용할 앱의 JavaScript 키를 설정해 주세요.
    Kakao.init('YOUR APP KEY');
    // // 카카오링크 버튼을 생성합니다. 처음 한번만 호출하면 됩니다.
    Kakao.Link.createDefaultButton({
      container: '#kakao-link-btn',  // 컨테이너는 아까 위에 버튼이 쓰여진 부분 id 
      objectType: 'feed',
      content: {  // 여기부터 실제 내용이 들어갑니다. 
        title: '딸기 치즈 케익', // 본문 제목
        description: '#케익 #딸기 #삼평동 #카페 #분위기 #소개팅',  // 본문 바로 아래 들어가는 영역?
        imageUrl: 'http://mud-kage.kakao.co.kr/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png', // 이미지
        link: {
          mobileWebUrl: 'https://developers.kakao.com',
          webUrl: 'https://developers.kakao.com'
        }
      },
      social: {  /* 공유하면 소셜 정보도 같이 줄 수 있는데, 이 부분은 기반 서비스마다 적용이 쉬울수도 어려울 수도 있을듯 합니다. 전 연구해보고 안되면 제거할 예정 (망할 google  blogger...) */
        likeCount: 286,
        commentCount: 45,
        sharedCount: 845
      },
      buttons: [
        {
          title: '웹으로 보기',
          link: {
            mobileWebUrl: 'https://developers.kakao.com',
            webUrl: 'https://developers.kakao.com'
          }
        },
        {
          title: '앱으로 보기',
          link: {
            mobileWebUrl: 'https://developers.kakao.com',
            webUrl: 'https://developers.kakao.com'
          }
        }
      ]
    });
  //]]>
</script> 

Javscript로 페이지 정보 불러오기

위에 방법대로 하면 항상 고정된 데이터에 대해 공유버튼이 생성되기 떄문에 매우 불편합니다. 글마다 매번 코드를 써줄 순 없지요. 서버사이드단(백엔드)에서 코드 사용이 가능하면 해당 부분에 직접 db에서 뽑은 내용을 넣어줄 수 있겠지만.. 그럴 수 없는 환경(보편적인 블로거들..ㅋㅋ, 특히 저와 같은 구글블로거...)에선 Javascript로 처리해주는게 깔끔합니다. 

<script src="//developers.kakao.com/sdk/js/kakao.min.js"></script>

<script src="//developers.kakao.com/sdk/js/kakao.min.js"></script>

<a href="javascript:;" id="kakao-link-btn">
<img src="//developers.kakao.com/assets/img/about/logos/kakaolink/kakaolink_btn_small.png" width="10px" />
</a>

<script type="text/javascript">
  //<![CDATA[
    // // 사용할 앱의 JavaScript 키를 설정해 주세요.
    Kakao.init('bfd4cd7749e2b1ffca24a00eeb5aaabc');
    // // 카카오링크 버튼을 생성합니다. 처음 한번만 호출하면 됩니다.
    Kakao.Link.createDefaultButton({
      container: '#kakao-link-btn',
      objectType: 'feed',
      content: {
        title: document.title,
        description: '내용, 주로 해시태그',
        imageUrl: document.images[0].src,
        link: {
          webUrl: document.location.href,
          mobileWebUrl: document.location.href
        }
      },
      social: {
        likeCount: 286,
        commentCount: 45,
        sharedCount: 845
      },
      buttons: [
        {
          title: 'Open!',
          link: {
            mobileWebUrl: document.location.href,
            webUrl: document.location.href
          }
        }  
      ]
    });
  //]]>
</script>

소셜 부분이나 Description 부분도 Javascript에서 값 가져올 수 있는 부분이라면 쉽게 만들 수 있습니다. 전.. 그럼 소셜 부분이나 확인해봐야겠네요. 결과는 댓글로 남겨놓겠습니다 :)

적용한 모습은 아래와 같습니다.

물론 테두리나 이런건 따로 적용...

클릭해보면 공유하기 창이 나타나고(앱에서 클릭 시 바로 톡으로 웹에서 클릭하면 웹 공유 페이지로) 공유하면 위에 코드 적용한대로 톡방에 공유됩니다. 




Share: | Coffee Me:

5/27/2018

Evasion technique using Wildcards, Quotation marks and backslash, $IFS(WAF, 방어로직 우회)

WildCards?

Wildcard는 OS에서 파일에 대해 다중처리를 위해 사용되는 기호입니다. 보편적으로 많이 사용하는건 * ? 등이 있고 덕분에 번거로운 작업을 한번에 처리할 수 있게 되죠.
뭐 대충 이런 경우이죠.

#> rm *.txt
=> .txt 로 끝나는 모든 파일을 삭제하라.

정리해보면 이정도 문자들이 있습니다.

.(dot)
 => 현재 위치, grep 에선 *과 동일
?(question mark)
 => 내용을 모를 때
*(asterisk)
 => 포함하는 모든
\(backslash)
-(dash)
 => 해당 범위 (1-5)
[](square brackets)
 => 괄호 내 문자 식별
[!](not)
 => 부정 ㅋㅋㅋ

와일드 카드를 활용하면 완벽하게 기억이 나지 않는 path, command에 대해서도

/???/?at

echo /*/*ss*

http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm

Evasion 1 - Wildcards

Wildcard를 이용하면 문자를 적게 사용하면서 명령어를 쓸 수 있습니다. 이것을 이용해서 문자열 기반의 필터링 규칙을 우회할 수 있게 됩니다.

원본 구문
#> cat /etc/passwd

Evasion
#> cat /???/??ss??
#> cat /???/pass*

모두 passwd 파일을 불러올 수 있습니다.

Output
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
[....]

Evasion 2 - Quotation marks and backslash

quot(" ') 문자와 backslash는 문자열을 표기합니다. 커맨드라인에서도 동일하게 문자열을 표기하는데, quot, slash가 있던 없던 명령으로 보기 때문에 문자열을 자르는 용도로도 사용이 가능합니다.
아래 명령을 보면..

#> whoami
#> who'a'mi
#> who"a"mi

모두 사용자 계정이 확인됩니다. 위에 wildcard와 조합을 해보면.. 이런 패턴이 가능하겠지요.

#> cat /???/pas's'??
#> cat /???/pas"s"??
#> cat /e*c/pa\s\swd


Evasion 3 - $IFS(입력필드 구분자)

공백 사용 불가능한 상황에선 내부변수나 특수문자 ,< 등을 이용해서 우회가 가능합니다.
여기서 $IFS는 입력필드 구분자로 기본적으로 따로 쓰이면 공백과 같은 의미를 지니며 특정 값에 대해 공백으로 치환해줄 수 있습니다.

#> IFS=,;`cat<<<cat,/etc/passwd`
#> cat$IFS/etc/passwd
#> cat${IFS}/etc/passwd
#> cat</etc/passwd
#> {cat,/etc/passwd}

언어에서 사용하는 부분도 똑같이 적용될까?

모든 함수가 공통적이진 않겠지만, 기본적으로 os 관련 함수는 동일하게 wildcard 처리를 진행합니다.

Ruby exec
irb(main):001:0> exec("cat /???/??ss??")
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

Python os.system
>>> os.system("cat /???/??ss??")
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

추가적인 포인트?

쉘에선 wildcard와 같이 여러가지 사용할 수 있는 트릭들이 존재합니다. 잘 활용해보면 또다른 패턴을 만들 수 있을 것 같네요 :)

$1, $2, $3, ... are the positional parameters.
"$@" is an array-like construct of all positional parameters, {$1, $2, $3 ...}.
"$*" is the IFS expansion of all positional parameters, $1 $2 $3 ....
$# is the number of positional parameters.
$- current options set for the shell.
$$ pid of the current shell (not subshell).
$_ most recent parameter (or the abs path of the command to start the current shell immediately after startup).
$IFS is the (input) field separator.
$? is the most recent foreground pipeline exit status.
$! is the PID of the most recent background command.
$0 is the name of the shell or shell script.
(https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables)



Share: | Coffee Me:

5/23/2018

Android App(apk) 서명하기(apk signing with jarsigner,keytool)

앱 코드 좀 고치고 리패키징 후 아무생각 없이 설치하다 보니 에러가 발생합니다.

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

apktool로 리패키징한 경우 자동으로 서명되지 않기 때문에 설치가 불가능해집니다. 보편적인 IDE는 자동으로 dev key로 서명을 해주지만,
아닌 경우에는 직접 서명이 필요합니다.

검색하면 많이 나오는 내용이지만, 작성해두면 나중에 보기 편하니 글로 작성해둡니다.

keytool을 이용하여 키생성 

#> keytool -genkey -alias hwul -keyalg RSA -validity 20000 -keystore hwul.keystore
키 저장소 비밀번호 입력:
새 비밀번호 다시 입력:

대충 옵션을 보면..

-genkey :
-keyalg : 알고리즘
-alias : 별칭
-keystore : 생성할 keystore 파일명

앱 서명하기

#> jarsigner -verbose -keystore ./hwul.keystore 1527037443_com.noname.apk hwul
Enter Passphrase for keystore:
   adding: META-INF/MANIFEST.MF
   adding: META-INF/HWUL.SF
   adding: META-INF/HWUL.RSA
  signing: AndroidManifest.xml
  signing: assets/common.js

jarsigner로 아까만든 keystore 파일을 이용해 앱에 서명해줍니다.
이제 서명 관련 에러가 발생하지 않습니다.

#> adb install 1527037443_com.noname.apk
1527037443_com.noname.apk: 1 file pushed. 0.5 MB/s (4477427 bytes in 8.781s)
WARNING: linker: app_process has text relocations. This is wasting memory and is a security risk. Please fix.
WARNING: linker: app_process has text relocations. This is wasting memory and is a security risk. Please fix.
    pkg: /data/local/tmp/1527037443_com.noname.apk
Success
Share: | Coffee Me:

5/20/2018

Mapscii - Ascii base Map on Linux terminal (리눅스 터미널에서 아스키 지도를 보자!)

종종 터미널 브라우저를 통해 웹서핑 하곤 합니다. 이전에 종종 쓰다보니 나름 편리한 경우도 있어 일반 브라우저랑 섞어서 사용하는데,
문뜩 이런 생각이 들었습니다.

터미널에서 지도를 볼 수 있을까?(아스키로?!)


그래서 git 을 뒤지다 보니 재미있는 프로젝트가 있어 공유드릴까 합니다.
아스키 지도 어플리케이션인 mapscii 입니다.

Install & Run


nodejs 기반 어플리케이션이며 npm으로 쉽게 설치가 가능합니다.

#> npm install -g mapscii
npm WARN deprecated coffee-script@1.12.7: CoffeeScript on NPM has moved to "coffeescript" (no hyphen)
/usr/bin/mapscii -> /usr/lib/node_modules/mapscii/bin/mapscii.sh
+ mapscii@0.1.7
added 27 packages from 20 contributors in 5.787s

#> mapscii


키보드 단축키로 이동,줌인/아웃하고 마우스로 해당 위치에 대한 좌표값을 얻을 수 있습니다.

원거리 지도에선 한국이 잘 안보이는데, 줌인 계속해서 보면 잘 보이네요 :)

작은 섬들은 확대하면 점점 보입니다

단축키(ShortCut)


up: 위
down: 아래
left: 왼쪽
right: 오른쪽
a: 줌인(zoom-in)
z: 줌아웃(zoom-out)
q: 종료(exit)

Project git

색상 표현도 잘되어있고 속도도 생각보다 빠릅니다(그래도 gui base가 훨씬 빨라요.. 비교 자체를 말아야함)

산 표시된 것 보고 놀램..

지도 내용에 대한 개선이나 코드 추가/수정이 필요해 보이면 아래 git에 직접 날리면 좋을 것 같네요

https://github.com/rastapasta/mapscii
Share: | Coffee Me:

5/17/2018

Metasploit WMAP의 모듈들(wmap Modules)

개인적으로 일이 있어 일주일만에 글거리를 정리하는데.. 정말 오랜만에 쓰는 기분이 드네요.
별다른건 아니지만 이전에 메모해둔거 풀어서 글 작성해봅니다.

wmap에 포함된 metasploit module입니다.

Groups


[*] wmap_ssl
 => ssl 버전과 상태에게 대해 체크

[*] wmap_server
 => 웹 서버(+web_app) 설정에 대한 체크

[*] wmap_dir
 => directory에 대한 brute force, method 체크 등

[*] wmap_file
 => file 기반의 brute force(backup 파일 같은거)

[*] wmap_unique_query
 => sql injection, traversal 등

[*] wmap_query
[*] wmap_generic

query, generic은 포함된 모듈이 없지만 이름으로 보았을 때 그냥 보편적인 모듈이 들어갈 것 같습니다.

Modules


[*] wmap_ssl
========

     Name                         OrderID
     ----                         -------
     auxiliary/scanner/http/cert  :last
     auxiliary/scanner/http/ssl   :last

ssl 정보에 대한 기본적인 체크 모듈입니다. 의외인건 ssl version, heartbleed 등 여러 체크모듈이 있는데 포함되지 않은거네요.
(그렇다고 느린것도 아닌데.., a2sv 모듈 좀 잡히면 추가해놔야겠심다)

[*] wmap_server
===========

     Name                                           OrderID
     ----                                           -------
     auxiliary/admin/http/tomcat_administration     :last
     auxiliary/admin/http/tomcat_utf8_traversal     :last
     auxiliary/scanner/http/drupal_views_user_enum  :last
     auxiliary/scanner/http/frontpage_login         :last
     auxiliary/scanner/http/host_header_injection   :last
     auxiliary/scanner/http/http_version            0
     auxiliary/scanner/http/open_proxy              1
     auxiliary/scanner/http/options                 :last
     auxiliary/scanner/http/robots_txt              :last
     auxiliary/scanner/http/scraper                 :last
     auxiliary/scanner/http/svn_scanner             :last
     auxiliary/scanner/http/trace                   :last
     auxiliary/scanner/http/vhost_scanner           :last
     auxiliary/scanner/http/webdav_internal_ip      :last
     auxiliary/scanner/http/webdav_scanner          :last
     auxiliary/scanner/http/webdav_website_content  :last

[*] wmap_dir
========

     Name                                                   OrderID
     ----                                                   -------
     auxiliary/scanner/http/brute_dirs                      :last
     auxiliary/scanner/http/dir_listing                     :last
     auxiliary/scanner/http/dir_scanner                     :last
     auxiliary/scanner/http/dir_webdav_unicode_bypass       :last
     auxiliary/scanner/http/file_same_name_dir              :last
     auxiliary/scanner/http/files_dir                       :last
     auxiliary/scanner/http/http_put                        :last
     auxiliary/scanner/http/ms09_020_webdav_unicode_bypass  :last
     auxiliary/scanner/http/prev_dir_same_name_file         :last
     auxiliary/scanner/http/soap_xml                        :last
     auxiliary/scanner/http/trace_axd                       :last


[*] wmap_file
=========

     Name                                     OrderID
     ----                                     -------
     auxiliary/scanner/http/backup_file       :last
     auxiliary/scanner/http/copy_of_file      :last
     auxiliary/scanner/http/replace_ext       :last
     auxiliary/scanner/http/verb_auth_bypass  :last


[*] wmap_unique_query
=================

     Name                                          OrderID
     ----                                          -------
     auxiliary/scanner/http/blind_sql_query        :last
     auxiliary/scanner/http/error_sql_injection    :last
     auxiliary/scanner/http/http_traversal         :last
     auxiliary/scanner/http/rails_mass_assignment  :last
     exploit/multi/http/lcms_php_exec              :last


[*] wmap_query
==========

     Name  OrderID
     ----  -------


[*] wmap_generic
============


unique_query 쪽에 exploit/multi/http/lcms_php_exec를 제외하면 exploit module은 하나도 없습니다.
이유인즉슨 동작에 대한 리스크일까 싶습니다. 처음엔 속도 때문일까 생각했었지만, exploit 모듈은 대다수가 auxiliary 보다 빠릅니다.
exploit 가능한 포인트만 체크하거나, 단일 페이로드로 요청을 수행하는 경우가 많기 때문이죠. auxiliary는 대체로 스캐너와 같이 다수의 요청을 전달해서 대상에 대해 파악합니다.

그래서 결국은 auxiliay는 속도가 오래걸리는 경우가 많습니다. 그러다보니 자연스레 속도보단 실행에 대한 리스크로 인해 빠졌다는 생각이 드네요.
자동 exploit이 아닌 scanner의 역할이기 떄문이죠. (자동 exploit은 autosploit 쪽을 보면 좋을듯합니다)

Share: | Coffee Me:

5/09/2018

Android Meterpreter shell 에서의 실행 권한 상승(Get Root!) on rooting device

저는 대체로 테스트폰에 작업할 때 meterpreter shell을 연결해놓고 사용합니다. 뭐랄까.. ssh는 굳이 열어두고 싶진 않고 adb는 케이블 건드려서 끊길때 마다 불편해서 그냥 exploit app 하나 내려놓고 필요할때마다 실행하죠.
(물론 remote adb가 있지만.. 요즘은 손이 안가네요)

아무튼 Android 환경에서 Meterpreter shell을 사용하다 보면 공통적으로 겪는 문제가 있는데요, 바로 실행 권한입니다.

보통 apk로 배포하거나, 브라우저 취약점을 이용하는 경우 앱을 실행하는 사용자 권한으로 실행되기 때문에 루팅된 단말이여도 Meterpreter는 root 권한으로 동작하지 않습니다.

오늘은.. (아니 당분간은 내용 계속 추가할듯..) Android Meterpreter 환경에서 실행 권한을 Root로 바꿀 수 있는 방법들에 대한 이야기를 할까 합니다.

Why?

유저 권한으로 동작하는 Meterpreter는 제한이 많습니다. 그냥 data/data 디렉토리 접근에도 권한 문제로 파일들을 볼 수 없고 그러죠..

meterpreter > cd /data/data
meterpreter > ls
[-] stdapi_fs_ls: Operation failed: 1

이렇게 Operation failed(결국은 권한에러..) 가 발생하는 이유는 앱의 실행권한이 유저 권한이기 때문에 그렇습니다.

meterpreter > ps -S metasploit
Filtering on 'metasploit'

Process List
============

PID    Name                  User
---    ----                  ----
28135  com.metasploit.stage  u0_a183

제 테스트 기기에선 u0_a183 으로 실행되고 있네요. 

보편적인 방법..

구글링을 해보면 거의 비슷한 이야기들이 나옵니다.  shell 명령으로 meterpreter에서 android shell로 넘어간 후 su 명령으로 root 권한을 얻으라는 이야기죠.

meterpreter > shell
Process 1 created.
Channel 1 created.
id
uid=10183(u0_a183) gid=10183(u0_a183) groups=1015(sdcard_rw),1028(sdcard_r),3003(inet),50183(all_a183) context=u:r:untrusted_app:s0
su
id
uid=0(root) gid=0(root) context=u:r:init:s0

옙. 물론 당연히 잘 됩니다.. 그러나 저는 meterpreter 상태에서 root 권한이고 싶습니다.
(exit로 넘어가게 되면 Channel이 종료되면서 권한이 다시 빠집니다. 결국 하위에 생성되는 shell 에만 su가 들어거기 떄문이죠.)

삽질1 - Post 모듈 찾아보기

혹시나 하는 마음에 Post 모듈을 뒤져보았습니다.

meterpreter > background
[*] Backgrounding session 6...
HAHWUL (Sessions: 1 Jobs: 0) exploit(multi/handler) > search android
[....]
   payload/android/meterpreter/reverse_http                                    normal     Android Meterpreter, Android Reverse HTTP Stager
   payload/android/meterpreter/reverse_https                                   normal     Android Meterpreter, Android Reverse HTTPS Stager
   payload/android/meterpreter/reverse_tcp                                     normal     Android Meterpreter, Android Reverse TCP Stager
   payload/android/meterpreter_reverse_http                                    normal     Android Meterpreter Shell, Reverse HTTP Inline
   payload/android/meterpreter_reverse_https                                   normal     Android Meterpreter Shell, Reverse HTTPS Inline
   payload/android/meterpreter_reverse_tcp                                     normal     Android Meterpreter Shell, Reverse TCP Inline
   payload/android/shell/reverse_http                                          normal     Command Shell, Android Reverse HTTP Stager
   payload/android/shell/reverse_https                                         normal     Command Shell, Android Reverse HTTPS Stager
   payload/android/shell/reverse_tcp                                           normal     Command Shell, Android Reverse TCP Stager
   post/android/capture/screen                                                 normal     Android Screen Capture
   post/android/manage/remove_lock                            2013-10-11       normal     Android Settings Remove Device Locks (4.0-4.3)
   post/android/manage/remove_lock_root                                        normal     Android Root Remove Device Locks (root)
   post/multi/manage/play_youtube                                              normal     Multi Manage YouTube Broadcast
   post/multi/manage/set_wallpaper                                             normal     Multi Manage Set Wallpaper
   post/multi/recon/local_exploit_suggester                                    normal     Multi Recon Local Exploit Suggester

권한 관련해선 suggester 정도가 있긴한데, 크게 도움은 되지 않습니다. (어차피 su로 바꾸면 끝인것을..)

삽질2 - shell to meterpreter

위에선 Post 모듈만 이야기드렸지만 Local exploit부터 여러가지로 고민을 좀 해봤지만 크게 성과과는 없었습니다.. 그러다 문뜩 든 생각이 기본 shell을 내린 후 (post 모듈로)su로 권한을 잡은 후 shell to meterpreter를 통해 쉘을 바꾸면 어떨까? 입니다.

결론부터 말씀드리면, 실패입니다.

왜인지는 모르겠지만, post 모듈 실행단계에서 죽어버리네욧..

좋은 모듈이죠!

삽질3 - Activity 실행 관련

현재 테스트중이자 그나마.. 가능성이 있어보이는 케이스는 meterpreter 가 있는 apk의 Activity를 root 권한에서 바로 실행하는 것 입니다.

테스트해보고 결과가 좋거나, 특이한 문제가 있다면 내용 추가하도록 하겠습니다.

[추가]

여러가지 테스트를 해봤지만.. 결론은 이 방법으론 불가능합니다.

Android Activity는 기본적으로 사용자 권한으로 실행되고, 관리자에서는 실행되지 않아서 am 이나 intent를 통해서 실행은 불가능합니다. 단, 개별 기능단위로 su 권한을 부여하고 쉘 명령을 내리는 방식은 가능한데(루팅기능 쓰는앱 까서 보니깐 이런식이더라구요), 그런식으로 하기 위해선 meterpreter apk에 smali 코드로 추가해줘야 가능할 것 같네요.

> adb shell am start --user 0 -a android.intent.action.MAIN -n com.metasploit.stage/.MainActivity

android.util.AndroidException: Can't connect to activity manager; is the system running?
    at com.android.commands.am.Am.onRun(Am.java:264)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
    at com.android.commands.am.Am.main(Am.java:76)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:250)
    at dalvik.system.NativeStart.main(Native Method)


Share: | Coffee Me:

MacOS에서 git 실행 시 CommandLIneTools 에러 발생한 경우 해결방법

최근(?)에 MacOS 배포판 업그레이드(시에라 => 하이시에라) 이후 git 명령에 문제가 생겼었습니다. (판올림을 좀 늦게하긴했죠..)

#> git
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

내용을 보면 CommandLineTools에 xcrun이 없어 의존성 문제로 git이 실행이되지 않는 것 같습니다.

해결방법

배포판 업그레이드 시 xcode 내 명령들에 대해서도 일부 변화가 생기는데요, 이를 맞춰주기 위해서 xcode 의 CommandLineTools를 재설치해줍니다. (xcode 재설치도 좋은 방법입니다)

#> xcode-select --install

Reference

https://stackoverflow.com/questions/32893412/command-line-tools-not-working-os-x-el-capitan-macos-sierra-macos-high-sierra
Share: | Coffee Me:

5/02/2018

Kali Linux 2(04.30) release review

4/30, Kali linux의 업그레이드가 있었습니다.
(https://www.kali.org/news/kali-linux-2018-2-release/)

간략하게 어떤점들이 추가되었는지 살펴보도록 하죠.



Metasploit script 

Metasploit사용뿐만 아니라 취약점 분석 자체에더 쓸만한 스크립트들이 업데이트 되었습니다. 아직 모든 스크립트들을 테스해본건 아니지만, hmac-crack이나 md5lookup, deserializer 등 귀찮은 작업들이 간단한 명령으로 체크할 수 있도록 추가되었죠.

msf-egghunter          msf-java_deserializer  msf-nasm_shell
msf-exe2vba            msf-jsobfu             msf-pattern_create
msf-exe2vbs            msf-makeiplist         msf-pattern_offset
msf-find_badchars      msf-md5_lookup         msf-pdf2xdp
msf-halflm_second      msf-metasm_shell       msf-virustotal
msf-hmac_sha1_crack    msf-msf_irb_shell

msf  스크립트니 Metasploit과 db 공유가 된다던가 데이터를 쉽게 넘길 수 있다던가 생각을 해봤지만.. 꼭 그런건 아니였습니다. 그래도 irb_shell의 경우 바로 콘솔에서 irb로 붙을 수 있어 자주 사용하게 될 것 같네요.

#> msf-msf_irb_shell
>> framework
=> #<Framework (0 sessions, 0 jobs, 0 plugins)>
>> framework.sessions
=> {}

이건 진짜 편하다!!! 맨날 rpcd 띄우기 귀찮았는데

이외에도 Metasploit과 직접적으론 연결되진 않지만 쓸만한 스크립트들이 많이 있습니다. 
(물론 연결되는 친구들도 있을거구요.. 다써보진 못해서)

e.g

#> msf-md5_lookup -h
Usage: msf-md5_lookup [options]

Specific options:
    -i, --input <file>               The file that contains all the MD5 hashes (one line per hash)
    -d, --databases <names>          (Optional) Select databases: all, authsecu, i337, md5_my_addr, md5_net, md5crack, md5cracker, md5decryption, md5online, md5pass, netmd5crack, tmto (Default=all)
    -o, --out <filepath>             (Optional) Save the results to a file (Default=md5_results.txt)
    -h, --help                       Show this message

#> msf-hmac_sha1_crack
Usage: msf-hmac_sha1_crack hashes.txt <wordlist | - >
The format of hash file is <identifier>:<hex-salt>:<hash>


#> msf-virustotal -f 123
[*] Using API key: 501caf66349cc7357eb4398ac3298fdd03dec01a3e2f3ad576525aa7b57a1987
[*] Please wait while I upload 123...
[*] VirusTotal: Scan request successfully queued, come back later for the report

많이들 짜서 쓰던 스크립트!

Spec up & package update

스크립트 이외에 여러가지 패치, 버전업이 있었습니다. 4.15 커널 지원 제외하곤 일반적인 업데이트니 참고정도만 하면 될 것 같습니다.

- Linux 4.15 Kenel 적용
- Spectre and Meltdown 패치 적용
- Bloodhound, Burp 등 주요 툴 버전 업데이트

How to upgrade?

#> apt-get update; apt full-upgrade

Share: | Coffee Me:

5/01/2018

Rails의 라우팅과 constraints를 이용하여 IP기반 ACL 만들기

Rails Application에서 접근제어를 하는 방법은 여러가지가 있습니다. 예전에 포스팅하기도 헀고, 튜토리얼에서도 기본적으로 이야기되는 HTTP Auth를 이용한 인증방식 부터 세션, 로그인 기반 인증까지 여러가지 형태로 구현이 가능하죠.
오늘은 가장 기본적인 접근제어인 IP 기반 ACL에 대한 이야기를 할까 합니다.

IP 기반 ACL?

많은 서버, 장비, Application 들이 ID/PW 기반 인증과 함께 IP ACL도 사용합니다.
그만큼 IP ACL은 간단하면서도 중첩됬을 떄 효율이 좋은 편이라 그런 것 같습니다.

제 블로그를 보시고 계신다면, 잘 아시는 개념이겠지만 한번 더 이야기하자면 white list(특정 IP만 접근), black list(특정 IP는 접근 불가) 형태로
IP, IP 대역별 접근 제어를 통해서 불필요한 접근이나 공격을 어느정도 막아줄 수 있습니다.

Rails에서 ACL?

어떤 기능이나 정책을 만들 때 항상 라이브러리를 먼저 찾게 됩니다. 잘 활용한다면 쉽고 안정적이게 프로그램을 만들 수 있으니 대체로 찾아보는 습관이 든 것 같습니다.
Rails에선 ACL을 어떻게 구현하고, 어떤 라이브러리 들이 있을까 찾아보았습니다.

대표적으로 Rails-auth와 함꼐 여러가지 라이브러리 들이 쓰이고 있었습니다.

acl9 - Acl9 is a role-based authorization system that provides a concise DSL for securing your Rails application.
AccessGranted - Multi-role and whitelist based authorization gem for Rails.
Authority - ORM-neutral way to authorize actions in your Rails app.
CanCanCan - Continuation of CanCan, an authorization Gem for Ruby on Rails.
Declarative Authorization - An authorization Rails plugin using a declarative DSL for specifying authorization rules in one place.
Petergate - Easy to use and read action and content based authorizations.
Pundit - Minimal authorization through OO design and pure Ruby classes.
http://awesome-ruby.com/#awesome-ruby-authorization

우선 Rails Auth는 인증서를 기반으롸고, 유저 단위로 관리되는 ACL 입니다. 가장 먼저 관심을 가져서.. 여러가지 시도해봤지만 IP ACL을 직접적으로 지원해주진 않았습니다.
(이걸로 글을 써볼까 하고 작성헀던 데이터들이.. 아쉬움과 함께 뭍혀갑니다. / 어차피 귀찮아서 안쓸거면서..)

다른 라이브러리들도 user base 인건 비슷비슷합니다...

그래서 고민하던 찰나, 예전에 Rails 튜토리얼 사이트에서 봤던 내용이 하나 생각났습니다. constraints 부분이였는데..
이걸로 IP ACL이 가능할 것 같았습니다.

그래서 바로 타이핑을 시작했지요.


Write route.rb with constraints!

Rails에서 route.rb는 라우팅 규칙을 정의하는 코드입니다. 여기에 작성된 코드대로 Rails Application이 접근하는 페이지를 각각의 Controller로 매핑시켜 줍니다.

보편적으로.. 이런식으로 많이 쓰죠.

get '/posts/:id', to: 'posts#show'

posts/ID값 타입으로 GET 요청을 받으면 post controller의 show로 넘겨라!
실제로 GET 요청으로 이러한 요청을 받으면 Rails는 post로 넘겨서 내용을 보여줄 수 있도록 하지요.

GET /posts/17 HTTP/1.1
Host: 127.0.0.1

그리고 모든 기능과 페이지를 하나하나 작성할 순 없으니.. 보통

resources :posts

이런식으로 리소스로 묶어줍니다. 이렇게 리소스로 한번에 처리하면 REST API 기준 CRUD 요청은 자동으로 매핑됩니다.

다시 본론으로 와서... constraints를 활용하면 라우팅 규칙에 제한을 둘 수 있는데 이를 IP주소와 비교해서 처리하면 그게 곧 IP 기반 ACL이 됩니다.

Rails.application.routes.draw do
  constraints(ip:"127.0.0.1") do     # ip가 127.0.0.1 인 경우에 아래 resources를 라우팅함
  resources :checks, :testers, :todos
  end
end

코드를 보면 127.0.0.1, 즉 localhost에서 접근한 요청만 resource로 매핑시켜주고 이게 아닌 경우 라우팅이 정의되지 않아 없는 페이지로 나타날겁니다.
테스틀 해보면..

1. localhost(127.0.0.1)에서 접근
Started GET "/checks" for 127.0.0.1 at 2018-04-29 13:16:39 +0900
Processing by ChecksController#index as HTML
  Rendering checks/index.html.erb within layouts/application


2. 다른host에서 접근
Started GET "/checks" for 192.168.0.14 at 2018-04-29 13:19:01 +0900
Cannot render console from 192.168.0.14! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255

ActionController::RoutingError (No route matches [GET] "/checks"):

이런식으로 localhost에서만 정상적으로 페이지가 로드됩니다.

추가로 개별 리소스에 대해서 제한을 걸 땐 리소스 내부에서 constraints으로 규칙을 걸어주면 됩니다.

resources :testers, constraints: { ip: /192\.168\.\d+\.\d+/ }
# testers 관련 요청은 192.168 대역에서만 접근이 가능하도록 ...

Share: | Coffee Me: