식별 및 인증 실패(Identification and Authentication Failures)는 OWASP TOP 10 2017에서는 A02으로 소개된 취약한 인증(Broken Authentication)를 포함해 2021에서는 A07로 소개되었다. 2017 대비 조금 더 넓은 의미를 포함한다.
대응 방안으로는 2중 인증을 구현하고, 비밀번호 설정 정책을 적용하고, 다수 로그인 실패 시 계정 잠금을 통해 지속적인 비인가 로그인 시도를 예방한다. 임의의 랜덤한 값으로 세션 ID를 생성해 부여하고, 암호화된 채널을 통해 전송 및 세션 ID를 재사용하지않고 폐기해야 한다.
취약점 유형
유효한 계정 목록을 가지고 있는 경우 Brute Forcing 등 자동화된 공격을 시도, 허용하는 경우 기본 계정 정보를 사용하는 경우 다중 인증이 존재하지 않는 경우 URL에 세션 ID를 노출하는 경우(GET Method) 세션 ID를 재사용하거나 만료된 세션 ID를 파기하지 않는 경우
공격 시나리오
유효한 계정 목록을 가진 공격자는 자동화 툴을 사용해 Brute Force 공격을 시도할 수 있고, 이때 , admin/admin 등 기본 계정 정보나 잘 알려진 계정 정보를 사용하고 있는 경우 공격자는 계정을 탈취해 임의의 명령을 수행하는 등 악의적인 행위를 수행할 수 있다.
대응방안
다중 인증 구현 기본 계정 정보를 사용 금지 안전한 패스워드 설정 정책 생성 및 인증 실패 횟수 제한 적용 임의의 랜덤한 세션 ID 생성, 암호화 채널 등 안전한 전송 수단을 통한 전송 및 재사용 금지와 만료된 세션 ID 파기
취약하고 오래된 구성 요소(Vulnerable and Outdated Components)는 취약한 버전이나 EoS, EoL(기술 지원 종료)인 소프트웨어를 계속 사용하는 경우 발생가능한 유형이다. 서비스를 구성하는 모든 요소(OS, WEB, DB, API 등)가 영향을 받는다.
대응방안으로는, 형상관리를 통해 불필요한 서비스를 제거하고, 버전 정보를 확인하여 최신 버전으로 업데이트를 적용한다. 또한, 모니터링을 통해 취약점이 발생한 버전을 확인하여 조치한다. 추가적으로, 애플리케이션 또는 포트폴리오의 수명 주기 동안 업데이트 또는 구성 변경을 모니터링, 분류 및 적용하기 위한 지속적인 계획을 수립해야 한다.
취약점 유형
기술 지원 종료된 OS를 사용하는 경우 취약점이 존재하는 애플리케이션, 프레임워크, 라이브러리 등을 사용하는 경우
공격 시나리오
취약한 버전의 아파치 스트럿츠 2(Apache struts 2)를 사용하고 있는 경우, 원격의 공격자가 서버를 공격해 원격코드를 실행할 수 있다.
대응방안
불필요한 소프트웨어나 서비스, 기능, 문서 등 제거 패치 관리, 형상 관리 프로세스 정립 - 소프트웨어 버전 확인 및 업그레이드 취약점 모니터링을 통한 취약한 소프트웨어 사용 유무 확인
- 공격자는 이전에 수집한 정보를 이용하여 다른 서버로 원격접속하여 내부이동 - 내부이동 시 위에서 사용한 RDP 정보수집 도구 및 네트워크 스캔 도구를 통해 추가 서버를 찾으며, 가장 많은 정보를 가지고 있는 서버를 거점으로 삼아 랜섬웨어 공격준비
* 대체로 백업서버가 모든 서버와 연결되는 서버이므로, 공격자가 거점으로 많이 선택
2.2.12 감염
- ATT&CK Matrix : T1486 Data Encrypted for Impact
- 공격자는 거점서버를 통해 다른 서버에 접속하여 랜섬웨어를 실행(RunExe.exe 파일과 EnCrypt.exe 파일을 사용) - RunExe.exe의 경우 VSS(VolumShadowCopy Service)를 삭제하고 디렉터리내 exe파일을 실행 - RunExe.exe를 통해 실제 파일을 암호화하는 EnCrypt.exe이 실행되어 파일을 암호화 - 랜섬웨어에 감염된 후, 각 폴더에 랜섬노트(RECOVERY INFORMATION !!!.txt)가 생성
2.2.13 로그 삭제
- ATT&CK Matrix : T1070.001 Indicator Removal on Host : Clear Windows Event Logs
T1070.004 Indicator Removal on Host : File Deletion
- 공격자는 랜섬웨어를 실행 후 공격 흔적을 지우기 위해서 이벤트로그(Security, System), 정보수집 도구 삭제
2.2.14 사후 정리
- ATT&CK Matrix : T1529 System Shutdown / Reboot - 공격자는 공격흔적을 모두 지운 뒤 서버 재부팅, 원격접속을 해제
- 공격자는 서버 사이드 스크립트(ASP, JSP, PHP 등)을 이용하여 웹쉘(WebShell)을 제작 및 업로드
웹쉘(Web Shell) 1. 웹페이지를 뜻하는 "웹(Web)"과 서버에게 명령을 내려 실행하기 위한 인터페이스 역할을 하는 "쉘(Shell)"의 합성어 2. 원격에서 웹서버에 명령어를 실행하기 위하여 만들어진 프로그램 3. 서버 사이드 스크립트(ASP, JSP, PHP 등)를 이용해 제작 4. 취약점을 이용해 웹 서버에 웹쉘 업로드 후 서버상의 정보 유출 및 변조, 악성코드 유포 등의 행위를 수행
- 업로드 파일에 대한 검증이나 환경 설정의 미흡으로 인해 발생할 수 있음
- 해당 공격을 성공하기 위한 조건은 3가지가 있음
공격 성공 조건 1. 파일 업로드가 가능해야 함 2. 파일이 업로드된 디렉터리의 경로를 알아야 함 3. 파일이 업로드된 디렉터리의 실행 권한이 있어야 함
2. 공격실습
2.1 웹쉘 제작
- [캡쳐 1]은 HTTP form에서 입력된 값을 GET 방식으로 전달 받으며, 값이 설정된 경우 쉘 명령어를 수행하는 웹쉘임
2.2 File Upload (Low Level)
- 파일 업로드 기능이 구현된 페이지에 웹쉘 업로드 시도
- 파일 업로드 결과 php 파일이 업로드 되었으며, 파일이 업로드 된 경로 또한 알 수 있음
- 파일 업로드 경로는 /dvwa/hackable/uploads/webshell.php임을 알 수 있음
1. 현재 디렉터리(/dvwa/vulnerabilities/upload) 2. 상위 디렉터리(../)로 2번 이동 후 /hackable/uploads/에 업로드
- 해당 경로로 접근 시 webshell.php 파일을 실행할 수 있으며, 임의의 명령을 수행할 수 있음
2.3 File Upload (Medium Level)
- 웹쉘(PHP) 업로드 시 JPEG나 PNG 파일만 업로드 가능하다는 에러 메시지를 출력함
- 업로드 파일의 type과 size를 검사하여 JPEG와 PNG 파일이 맞는지 확인하여 필터링을 수행
- Content-Type 헤더 변조를 통해 우회할 수 있음
Content-Type : 클라이언트가 서버에 자원을 보낼 때 어떤 유형의 자원을 보내는지 알려주는 헤더
- 버프슈트를 이용해 요청을 인터셉트하여 content-type 헤더를 [캡쳐 8]과 같이 변경
- 변경 후 업로드에 성공한 것을 확인할 수 있음
- 해당 경로에 접근하여 임의의 명령 수행이 가능함
2.4 File Upload (High Level)
- 파일 업로드 시 [캡쳐 5]와 같이 JPEG나 PNG 파일만 업로드 가능하다는 에러 메시지를 출력함
- 업로드 파일명에서 .를 기준으로 나누어 확장자명만을 추출하여, 확장자가 JPG, JPEG, PNG가 맞는지,업로드 파일 사이즈 검증 및 getimagesize함수를 통해 업로드된 파일이 이미지인지 필터링
getimagesize() : 지정된 이미지 파일의 크기를 확인해서 파일타입과 이미지의 크기에 대한 정보를 배열 형태로 출력
- content-type 변조를 통한 우회 방법은 확장자명이 php를 유지하기 때문에 해당 방법은 통하지 않음
- 확장자 검사를 우회하기 위해 확장자명을 .php.jpg로 변경 및 getimagesize() 우회를 위해 GIF89a 추가
GIF89a : GIF 이미지 파일 표준에 정의된 값으로 이미지 파일인 것처럼 속이는 것이 가능
- 버프슈트를 통해 파일명과 GIF89a를 추가하여 전송하면 파일 업로드에 성공함
- 업로드 후 해당 경로에 접근하면 웹쉘이 실행되지 않는데, 이는 업로드한 파일이 jpg 확장자를 가지기 때문임
- [캡쳐 12]에서 디렉터리 이동문자에 대한 필터링이 없으므로, ../를 추가하여 시도해 보았으나 실패함(추가적인 매개변수 등이 있는 것으로 판단됨)
2.5File Upload (Impossible Level)
- Impossible Level의 소스코드를 확인하면 필터링을 2번 수행하는 것을 확인할 수 있음
- 2번의 검증을 통해 php 파일인 웹쉘이 본연의 역할을 수행하지 못하게 됨.
1. 업로드한 파일 이미지인지 확장자, Type, getimagesize함수를 이용해 검증 2. 1차 검증을 통과한 파일의 내용으로 이미지 파일 재생성 - imagecreatefromjpeg() : 파일 또는 URL에서 새 이미지 만들기 - imagejpeg() : 브라우저 또는 파일에 이미지 출력