- ls -al 명령으로 홈 디렉터리의 내용을 출력하였을 때의 결과이며, hint 파일의 내용을 확인.
- cat 명령으로 hint 파일의 내용을 확인하면, level2 권한에 setuid가 걸린 파일을 찾아야하는 것을 알 수 있음.
특수 권한
setUID
- setUID가 설정된 파일을 실행하면 해당 파일이 실행되는 동안에는 파일을 실행한 사용자의 권한이 아니라 파일 소유자의 권한이 적용 - 사용법: chmod 4000 [파일명] - 부여 후 ls로 확인 해보면 소유자의 실행권한에 s가 표시되며, 기존 권한에 실행권한이 없으면 대문자 S가 표시 - 예시 : /usr/bin/passwd
setGID
- setGID가 설정된 파일을 실행하면 해당 파일이 실행되는 동안에는 파일을 실행한 사용자의 권한이 아니라 파일 소유 그룹의 권한이 적용 - 사용법: chmod 2000 [파일명] - 부여 후 ls로 확인 해보면 그룹의 실행권한에 s가 표시되며,기존 권한에 실행권한이 없으면 대문자 S가 표시 - 예시 : /usr/bin/wall
Sticky Bit
- Sticky Bit는 디렉터리에 설정하며, 디렉터리에 스티키 비트가 설정되어 있으면 이 디렉터리에는 누구나 파일을 생성할 수 있으나, 디렉터리의 소유자 or 파일 소유자 or 관리자가 아닌 사용자들은 파일을 삭제하거나 변경할 수 없음. - 파일은 파일을 생성한 계정으로 소유자가 설정 - 사용법: chmod 1000 [디렉터리명] - 부여 후 ls로 확인 해보면 기타 사용자의 실행권한에 t가 표시되며, 기존 권한에 실행권한이 없으면 대문자 T가 표시 - 예시: tmp 디렉터리
- find 명령을 이용해 hint 파일의 내용에 부합하는 파일을 찾을 수 있음
- 아래의 명령을 사용하면 명령 수행 중 권한이 없는 파일에 대한 에러가 함께 출력되어 결과확인이 어려움
수행 명령 : $ find / -perm -4000 -user level2 명령어 동작 : 최상위 루트 디렉터리(/)에서부터 setUID가 설정된 파일(-perm -4000) 이면서 파일 소유자가 level2(-user level2)인 파일을 찾음(find)
find
- 사용법 : find [옵션] [경로] [표현식] - 리눅스 파일 시스템에서 파일을 검색하는 데 사용되는 명령어 - 상대 경로, 절대 경로 모두 가능
-perm
- 파일의 권한으로 탐색한다. - [-] : 설정된 권한의 모든 것이 설정된 파일을 찾는 것 - [+] : 설정된 권한 중 하나라도 설정된 파일을 찾는 것
-user
- 지정한 사용자가 소유하고 있는 파일 찾기
- 표준 입출력과 리다이렉션을 활용하여 출력되는 결과를 간소화 할 수 있음.
- /dev/null은 일종의 휴지통을 의미함.
파일 디스크립터
파일 디스크립터의 이름
정의
0
stdin
명령어의 표준 입력
1
stdout
명령어의 표준 출력
2
stderr
명령어의 표준 에러
리다이렉션 기호
형태
의미
>
[명령어] > [파일]
명령어의 결과를 파일에 덮어쓰기
<
[명령어] < [파일]
파일의 내용을 명령어의 입력으로 사용
>>
[명령어] >> [파일]
명령어의 결과를 파일에 추가
- 위 명령을 통해 level2 권한에 setuid가 걸린 파일을 찾을 수 있음.
- ls 명령을 통해 확인해보면 hint 파일에서 확인한 조건과 동일한 파일임을 알 수 있음.
- 해당 파일을 실행해 보면, 비밀번호를 확인할 수 있는 my-pass 명령어와 권한 변경 명령인 chmod를 제외한 한가지 명령을 레벨2의 권한으로 실행시켜 줌
- 명령어 해석기 역할을 수행하는 쉘(/bin/bash)를 실행시키면, level2의 권한으로 쉘이 실행되며, my-pass 명령을 통해 level2의 비밀번호를 확인할 수 있음.
2. GDB를 통한 의사 코드 복원
- system>chdir>print 순으로 함수 호출이 이루어지며 그 값은 다음과 같음
- clear 명령으로 화면을 초기화 한 후 level2의 홈 디렉터리로 이동 및 printf로 출력
- fgets>strstr 순으로 함수 호출이 이루어지며, 그 값은 다음과 같음
- fgets()함수를 통해 사용자로부터 값을 입력 받은 후 strstr()함수를 통해 사용자 입력값이 my-pass, chmod 검증
- printf>setreuid>system 순으로 함수 호출이 이루어지며, setreuid()의 인자값을 0xbba(10진수 3002)로 설정(level2의 권한) 및 system 함수로 사용자 입력값을 실행
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
//변수 선언
char *str1="my-pass";
char *str2="chmod";
char *input[30];
system("/usr/bin/clear"); // 화면 초기화
chdir("/home/level2"); // 디렉터리 이동
// 문자열 출력
printf("\n\n\n\t\t레벨2의 권한으로 당신이 원하는 명령어를\n");
printf("\t\t한가지 실행시켜 드리겠습니다. \n");
printf("\t\t(단, my-pass 와 chmod는 제외)\n");
printf("\n\t\t어떤 명령을 실행시키겠습니까?\n");
printf("\n\n\t\t[level2@ftz level2]$ ");
fgets(input,sizeof(input),STDIN); // 사용자 값 입력
if(strstr(input,str1) != NULL) // 사용자 입력값이 my-pass인 경우 종료
{
printf("\n\t\tmy-pass명령은 사용할 수 없습니다. \n\n");
exit(0);
}
if(strstr(input,str2) != NULL) // 사용자 입력값이 chmod인 경우 종료
{
printf("\n\t\tchmod명령은 사용할 수 없습니다. \n\n");
exit(0);
}
printf("\n\n");
setreuid(3002,3002); // level2의 권한 부여
system(input); // 사용자 입력값 실행
}
서버 측 요청 변조(Server-Side Request Forgery, SSRF)는 2021년에 신설된 항목이다. SSRF는 서버 측에서 위조된 요청을 보내도록 하는 취약점이다. 애플리케이션이 사용자 제공 데이터에 대해 적절한 검증 없이 사용할 경우 서버로 하여금 공격자가 강제한 제어 동작을 수행하게 된다.
대응방안으로는 클라이언트가 제공한 입력값을 검증하도록 하고, 클라이언트 요청에 대한 응답을 전송하기 전에 서버측에서 결과를 검증한다. 또한, 방화벽을 통해 접근제어 규칙을 적용하여 네으퉈크단에서 필터링을 수행한다.
취약점 유형
사용자 입럭 데이터에 대한 적절한 검증없이 로컬 혹은 원격 리소스에 접근하도록 하는 경우
공격 시나리오
추후 업로드 예정
대응방안
내부 네트워크간 통신의 경우에도 방화벽을 통해 접근통제 규칙을 적용 모든 사용자 입력 데이터에 대한 검증 클라이언트 요청 수행 후 응답에 대해 서버측 결과 검증
소프트웨어 및 데이터 무결성 오류(Software and Data Integrity Failures)는 OWASP TOP 10 2017에서는 A08로 소개된 안전하지 않은 역직렬화(Insecure deserialization)를 포함해 2021에서 신설된 항목이다.
애플리케이션이 신뢰할 수 없는 소스, 저장소 및 CDN의 플러그인, 라이브러리 또는 모듈에 의존하는 경우 발생할 수 있다. 충분한 무결성 검증 없이 수행되는 자동 업데이트 기능을 악용해 공격자가 직접 업데이트를 업로드해 조작된 파일을 배포하고 설치, 실행 할 수 있다.
대응 방안으로는 신뢰할 수 있는 라이브러리를 사용하고, 전자서명이나 해시를 통해 무결성을 확인한다. 또한,CI/CD(Continuous Integration/Continuous Deliver_지속적 통합/지속적 제공) 파이프라인의 경우 개발 및 배포 과정에서 변조되면 무결성이 훼손될 가능성이 있으므로, 무결성 검증 과정을 추가해야한다.
취약점 유형
사용중인 라이브러리에 무결성 검증 기능이 없어 변조가 가능한 경우 업데이트에 대한 검증이 없는 경우 - 공급망 공격 가능 CI/CD 파이프라인에 대한 보안성 검토가 부족하거나 없는 경우 직렬화된 데이터에 대한 무결성 검증이 없는 경우
공격 시나리오
공격자는 공급망 공격(시스템 및 데이터에 접속할 수 있는 외부 협렵업체나 공급업체를 통해 시스템에 침투하여 합법적인 앱 감염 후 멀웨어 배포)을 통해 시스템을 장악한 후 인증서 탈취, 코드 패치, 업데이트 위장 등의 방식으로 악성코드를 업로드할 수 있다. 악성코드는 정상 파일로 위장되어 배포되고, 사용자들이 이를 다운로드하면서, 악성코드 감염 및 추가 공격을 수행할 수 있다.
대응방안
전자서명, 해시 알고리즘을 통한 무결성 검증 사용중인 라이브러리에 대한 신뢰성 확인 및 중요한 서비스일 경우 내부 라이브러리 사용 CI/CD 파이프라인에 대한 보안성 검토 직렬화된 데이터에 대한 무결성 검증 수행
식별 및 인증 실패(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 파기