기본 콘텐츠로 건너뛰기

CVE-2017-12850

CVE-2017-12850 프로젝트 관리를 위해 사용하는 KanBoard 에서 다른 사용자의 비밀번호를 변경할 수 있는 취약점(CVE-2017-12850)이 발생하였다. KanBoard Github 의 Commit 에서 두 개 파일을 수정한 것을 확인할 수 있다. app/Controller/UserCredentialController.php list ( $valid , $errors ) = $this ->userValidator->validatePasswordModification( $values ); + if (! $this ->userSession->isAdmin()) { + $values [ 'id' ] = $this ->userSession->getId(); + } + if ( $valid ) { if ( $this ->userModel->update( $values )) { $this ->flash->success(t( 'Password modified successfully.' )); 먼저 UserCredentialController.php 파일에 추가된 소스코드를 살펴보자. if 문을 이용하여 관리자 계정 유무를 확인하고 관리자 계정이 아닐 경우 유저 인증 값에서 ID 값을 추출하여 $values[‘id’] 값에 넣는 것을 확인할 수 있다. 관리자 계정이 아닐 경우, 비밀번호 변경을 요청 세션 값에서 ID를 추출하여 변경하게 함으로 다른 사용자의 비밀번호를 무단으로 변경하지 못하게 막았을 것이라 추측해볼 수 있다. app/Validator/UserValidator.php $v = new Validator( $values , array_merge( $rules , $

Frida-tutorial_1

Frida-tutorial_1 모바일 보안 검색을 하던 중 Frida 를 알게 되었다. 간단히 살펴보려고 했으나, Frida의 강력함을 느끼고 시간을 두고 깊이 있게 다뤄봐야겠다는 생각이 들었다. 실제 프로젝트 진행에 앞서 크랙미나 CTF 문제들을 통해서 활용법을 알아보자. OWASP Crackme Level 1 adb install sg.vantagepoint.uncrackable1.apk 어플리케이션 설치 후 실행해보면 루팅 디바이스 탐지로 인해 곧바로 종료되는 것을 확인할 수 있다. 디컴파일러를 이용하여 MainActivity 의 onCreate 함수를 확인해보자. protected void onCreate (Bundle bundle) { if (sg.vantagepoint.a.c.a() || sg.vantagepoint.a.c.b() || sg.vantagepoint.a.c.c()) { this .a( "Root detected!" ); } if (sg.vantagepoint.a.b.a((Context) this .getApplicationContext())) { this .a( "App is debuggable!" ); } super .onCreate(bundle); this .setContentView( 2130903040 ); } if (sg.vantagepoint.a.c.a() || sg.vantagepoint.a.c.b() || sg.vantagepoint.a.c.c()) 조건문을 이용하여 루팅 디바이스 탐지를, if (sg.vantagepoint.a.b.a((Context)this.getApplicationContext())) 조건문을 통해서 디버킹 탐지를 수행하고 있는 것을 확인할 수 있다. 이제 조건이 참인 경우 이동하

CVE-2017-2885

CVE-2017-2885 libsoup 는 GNOME HTTP client/server 라이브러리로 GNOME 응용 프로그램과 호환성이 좋고 스레드 응용 프로그램을 위한 동기식 API도 제공하고 있다. 최근 스택 기반 버퍼 오버플로우가 발생(CVE-2017-2885)되어 조치되었다. 해당 취약점에 대해서 알아보자. CVE-2017-2885 GNOME libsoup 2.58 버전에서 HTTP 요청 값을 이용하여 스택 기반 오버플로우를 유발시켜 원격 코드실행이 가능하다. GNOME libsoup는 HTTP 요청 및 응답을 처리하기 위한 클라이언트 및 서버 측 코드를 구현할 때 사용되는 라이브러리이다. 일반적으로 기본 웹 서버 기능을 위해 미디어 스트리밍 서버와 같은 다른 응용 프로그램에 내장되어 사용된다. 또한 독립적으로 사용할 수 있으며 하드웨어 장치에 내장도 가능하다. chunk 로 인코딩된 데이터가 포함된 HTTP 요청을 처리할 때, 부적절한 경계 검증으로 인해 정적으로 크기가 지정된 스택에 대용량 메모리를 복사할 수 있다. 오버플로우를 유발하는 코드는 libsoup/soup-body-input-stream.c 파일의 soup_body_input_stream_read_chunked 함수이다. static gssize soup_body_input_stream_read_chunked (SoupBodyInputStream *bistream, void *buffer, gsize count, gboolean blocking, GCancellable *can

DLL Hijacking

DLL Hijacking Windows의 높은 시장 점유율이 완벽한 보안으로 연결되지는 않는다. DLL Hijacking이 그 대표적인 예로 비즈니스 어플리케이션에 많은 영향을 미치고 있다. Windows DLL DLL(Dynamic-Link Libraries)는 데이터와 실행가능한 코드의 모음이다. 소프트웨어 개발 시 DLL을 이용함으로써 쉬운 소프트웨어 업데이트와 어플리케이션 간의 DLL 파일 코드 공유를 통한 메모리 사용률 감소를 기대할 수 있다. Windows DLL Search Order 프로그래머들은 종종 절대경로를 지정하지 않고 DLL 파일을 사용하며, 이는 DLL Hijacking을 야기시키는 결과를 가져온다. 마이크로 소프트에서는 다음과 같은 과정을 거쳐 DLL 파일을 찾는다. Created with Raphaël 2.1.2 Directory of the Application Current Directory 16 bit System Directory Windows Directory Directory in PATH value Principles of DLL Hijacking 우리는 Windows가 DLL 파일을 찾는 방식을 통해서 DLL Hijacking을 이해할 수 있다. 예를 들어 어떤 어플리케이션에서 function.dll 파일이 필요한 데 절대경로가 지정되어 있지 않다면, 악의적인 사용자가 function.dll 파일이 위치한 경로보다 우선 순위가 높은 곳에 자신의 DLL 파일을 위치시켜 악의적인 코드를 실행시키게 할 수 있다. Finding DLL Hijacking Vulnerabilities DLL Hijacking을 찾는 좋은 방법은 Process Monitor 를 활용하는 것이다. 프로그램을 실행 시 Process Monitor 를 이용하여 절대경로를 지정하지 않고 불러오는 DLL 파일이 존재하는 지 확인한다. Process Monitor 적용 필터 Operation is Que

CVE-2017-12425

CVE-2017-12425 Varnish HTTP Cache 는 HTTP Reverse Proxy로 알려진 웹 어플리케이션 accelerator이다. 최근 Varnish HTTP Cache 에서 DoS(Denial-of-Service) 취약점 CVE-2017-12425이 보고되었다. Bug Versions affected 4.0.1 to 4.0.4 4.1.0 to 4.1.7 5.0.0 5.1.0 to 5.1.2 Varnish VCL snippets 사용 시 Transfer-encoding: chunked 를 시도한 클라이언트의 요청 본문 값을 더 크게 전송할 경우 Varnish 데몬이 재시작되는 일이 발생했다. 일반적으로는 chunk 요청을 하지 않지만 B2B 어플리케이션이나 API와 같은 분야에서는 사용되는 경우들이 있다. 기존에 존재한 if 검증 로직은 아래와 같다. 음수 값(64-bit signed integer보다 큰 사이즈로 표현됨)을 이용하여 DoS 공격이 발생하게 된다. cl = (ssize_t) cll; if ((uintmax_t) cl! = cll) 실제 요청 값이 큰 값으로 위조된 것이 아닌 지 확인하는 로직이 존재했지만, 음수에 대한 조건이 누락되어 DoS공격이 발생했다. 참고 : Github Issue page Fix 0보다 작을 경우에 대한 조건을 추가하여 조치완료된 것을 확인할 수 있다. if (q == NULL || *q != '\0' ) ERR( "chunked header number syntax" ); cl = (ssize_t)cll; - if ((uintmax_t)cl != cll) + if (cl < 0 || (uintmax_t)cl != cll)

Windows-Kernel-Exploit

Windows-Kernel-Exploit 1. 개요 1.1. 왜 터널인가. 난이도가 높다. DEP, ASLR, UAC, Heap checks, Protected Mode, Sandboxes 등을 유저 모드에 도입하여 유저 모드와 난이도가 비슷하거나 오히려 더 쉬울 수도 있다. 유저 모드 보안과 병행한 많은 OS 기능이 커널로 이동하여 새로운 사용자 - 커널 인터페이스가 도입된 후 커널의 공격 영역이 크게 증가했다. 1.2. 무엇이 다른 가 잘못하면 블루스크린이나 시스템 재부팅으로 이어질 수 있다. 사용 권한에 대해 걱정할 필요가 없다. 더 많은 지식이 필요하다. 프로세스 경계가 없으므로 더 많은 것을 해볼 수 있다. 1.3. 필요 배경지식 Kernel APIs Memory Layout Interrupts, IRQLs, DPCs, IRPs Synchronization: Events, Spinlocks, Mutexes, Timers, Semaphores, Resources Paging mechanism Intel System Architecture Device Driver structure, MJ functions, IOCTLs 1.4. 취약점 연구 먼저 하이 레벨 접근법부터 시작하자 복잡한 로직을 찾는다. 서로 다른 팀의 협력이 필요한 인터페이스가 취약하다(예를 들어 사용자와 커널 간의 상호 작용이 필요한 부분) Remote 취약점보다 권한 상승이 더 쉽다. 여러 약한 공격이 하나의 강력한 공격으로 구성될 수 있다. 2. 본론 2.1. 취약점 발견을 위한 세 가지 접근법 하이 레벨 접근법 전체 시스템의 동작 과정을 이해하고 취약한 부분을 찾는다. 로우 레벨 접근법 복잡해보이는 함수를 찾고 분해하며 버그를 찾는다. 퍼징 접근법(블랙 박스 / 무차별 대입) 가능한 모든 유형의 값을 삽입하여 충돌을 유발시키고 충돌 정보를 살펴본다. 2.1.

CVE-2017-12061_CVE-2017-12062

CVE-2017-12061, CVE-2017-12062 MantisBT 는 오픈소스 이슈 트래킹 도구 중 하나이며 간편한 사용법으로 많은 사용자를 보유하고 있다. 최근 Cross Site Scripting 취약점 (CVE-2017-12061, CVE-2017-12062)이 발생하였고 조치가 완료되었다. 수정된 소스코드를 통해서 해당 취약점을 살펴보자. CVE-2017-12061 취약점이 발생된 곳은 /admin/install.php 소스이다. 영향 버전: 1.3.11 and older, 2.5.1 and older 조치 버전: 1.3.12, 2.5.2, 2.6.0 (not yet released*) POC http://mantis.server/admin/install.php?install=3&database_name=%3Ch1%3EXSS&admin_username=%3Ch1%3EXSS http://mantis.server//admin/install.php?install=3&database_name=%3Cscript%3Ealert(%27XSS%27)%3C/script%3E&admin_username=%3Cscript%3Ealert(%27XSS%27)%3C/script%3E Fix # the check only works on mysql if the database is open $t_version_info = @ $g_db ->ServerInfo(); } else { - print_test_result( BAD, true , 'Does administrative user have access to the database? ( ' . db_error_msg() . ' )' ); + print_test_result( + BAD, + true , + &