기본 콘텐츠로 건너뛰기

라벨이 ThreatAnalysis인 게시물 표시

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 , $

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

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)

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 , + &

CVE-2016-5180

CVE-2016-5180 1-byte-write-heap-buffer-overflow in c-ares c-ares 는 비동기 DNS 요청을 위한 C 라이브러리이다. c-ares 에서 발견된 heap buffer overflow 취약점 CVE-2016-5180을 알아보자. target.cc c-ares 퍼징 테스트를 위해 작성된 target.cc 파일을 먼저 살펴보자. #include <stdint.h> #include <stdlib.h> #include <string> #include <arpa/nameser.h> #include <ares.h> extern "C" int LLVMFuzzerTestOneInput( const uint8_t *Data, size_t e) { unsigned char *buf; int buflen; std :: string s( reinterpret_cast < const char *>(Data), Size); ares_create_query(s.c_str(), ns_c_in, ns_t_a, 0x1234 , 0 , &buf, buflen, 0 ); free (buf); return 0 ; } ares_create_query 함수 인자 값으로 Data 값을 캐스팅하여 전달한다. ares_create_query : 단일 DNS 쿼리 버퍼 작성 reinterpret_cast : 포인터를 다른 포인터 형식으로 변환 string.c_str() : string 문자열의 첫번째 문자의 주소를 반환 이제 빌드하여 분석을 해보자. mkdir -p ~/c-ares-CVE- 2016 - 5180 ; rm -rf ~/c-ares-CVE- 2016 - 5180 ; cd ~/c-ares-CVE- 2016 - 5180 ~/FTS/c-ares-C

CVE-2017-11691

Cacti: CVE-2017-11691: Cross-site scripting Cacti 는 네트워크 그래프 솔루션으로 쉬운 인터페이스와 PIA(Plugin Architecture) 패치를 통해 적용 가능한 다양한 플러그인들로 인해 많은 사용자들이 이용하고 있다. Referer 값에 스크립트 구문 삽입 시 해당 스크립트가 동작되는 XSS(Cross Site Scripting) 취약점이 1.1.13 버전에서 발생하였다. 취약점이 발생한 파일은 auth_profile.php 로 현재는 조치가 완료된 상태이다. POC 요청 시 Referer 값에 스크립트 구문 삽입 http://192.168.1.206/cacti/auth_profile.php?action=edit Referer: test4fun’;alert(1)// 페이지 내 'Return' 버튼 선택 스크립트 동작 확인 Fix Referer 값을 htmlspecialchars() 함수를 이용하여 치환하는 방식으로 조치되었다. htmlspecialchars() 특수문자를 HTML 인코딩 형식으로 치환 '&' : '&amp;' '"'(겹따옴표) : '&quot;' '''(홑따옴표) : '&#039;' '<' : '&lt;' '>' : '&gt;' $( 'input[value="<?php print __esc(' Return ');?>"]' ).unbind().click( function (event) { - document.location = '<?php print $_SESSION[' profile_referer '];?>

CVE-2014-0160_LIBFUZZER

CVE-2014-0160(HeartBleed)_LIBFUZZER 벌써 발견된지 3년이나 지난 취약점이 된 HeartBleed 를 이용해서 LIBFUZZER 사용법을 숙지해보자. 구글에서는 친절하게 LIBFUZZER 를 학습할 수 있게 Testcase 들을 제공해주고 있다. target.cc Openssl 퍼징 테스트를 위해서 작성된 target.cc 파일을 먼저 살펴보자. #include <openssl/ssl.h> #include <openssl/err.h> #include <assert.h> #include <stdint.h> #include <stddef.h> #ifndef CERT_PATH # define CERT_PATH #endif SSL_CTX *Init() { SSL_library_init(); SSL_load_error_strings(); ERR_load_BIO_strings(); OpenSSL_add_all_algorithms(); SSL_CTX *sctx; assert (sctx = SSL_CTX_new(TLSv1_method())); /* These two file were created with this command: openssl req -x509 -newkey rsa:512 -keyout server.key \ -out server.pem -days 9999 -nodes -subj /CN=a/ */ assert(SSL_CTX_use_certificate_file(sctx, CERT_PATH "server.pem" , SSL_FILETYPE_PEM)); assert(SSL_CTX_use_PrivateKey_file(sctx, CERT_PATH "server.key" ,

American Fuzzy Lop And Address Sanitizer

American Fuzzy Lop And Address Sanitizer Address Sanitizer(ASAN) 단지 gcc/clang에 -fsanitize=address 옵션을 추가하는 것으로 간단히 사용할 수 있지만 그 효과는 충분하다. Example Out Of Bounds Read #include <stdio.h> int main() { int a[ 2 ] = { 3 , 1 }; int i = 2 ; printf ( "%i\n" , a[i]); } 예제 파일을 OutOfBoundsRead.c 로 생성하고 ASAN 옵션을 지정하여 clang 으로 컴파일하자. clang -g -fsanitize = address -fno -omit -frame -pointer OutOfBoundsRead . c -o OutOfBoundsRead 생성된 OutBoundsRead 파일을 실행하면 다음과 같은 결과를 볼 수 있다. ================================================================= ==3678==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc0ba87428 at pc 0x47b7db bp 0x7ffc0ba87390 sp 0x7ffc0ba87388 READ of size 4 at 0x7ffc0ba87428 thread T0 ==3678==WARNING: Trying to symbolize code, but external symbolizer is not initialized! #0 0x47b7da (/root/ASAN/OutOfBoundsRead+0x47b7da) #1 0x7faba0260f44 (/lib/x86_64-linux-gnu/libc.so.6+0x21f44) #2 0x