1. Enumeration
: Port scan
: shard directory, 마운트 가능여부 확인
> access denied
: web enum
> 사용자 계정 확인
liam@lunar.local
: Nikto
> /backup.zip
: 핵심이 되는 소스 내용 확인
<?php
session_start();
include 'creds.php';
$error = null;
if ($_POST) {
if ($_POST['email'] && !empty($_POST['email']) && $_POST['email'] === 'liam@lunar.local'
&& strcmp($_POST['password'], $pwd) == 0) {
$_SESSION['email'] = $_POST['email'];
header('Location: dashboard.php');
die();
}
else {
$error = "Email or password is incorrect.";
}
}
?>
> creds.php를 참조(include)
> if 문을 보면 아이디는 email 변수 값은 위에서 찾은 사용자 메일 주소 (=== 엄격한 비교)
> 비번은 문자열을 비교할때 사용하는 strcmp 함수를 사용해 (== 느슨한 비교)
POST 방식으로 password를 받고 $pwd 변수 값을 비교하는데
$pwd 변수는 login.php 내에 선언되어 있지 않으니
아마 참조하고 있는 creds.php 파일 내에 선언되어 있을거라 추측
> creds.php 파일을 읽어볼 방법을 찾던가 해당 코드를 우회할 방법을 찾아야 함
2. Exploitation
2-1) strcmp 취약점
OWASP의 PHP MAGIC TRICK
(https://owasp.org/www-pdf-archive/PHPMagicTricks-TypeJuggling.pdf)
34~36 페이지를 보면
strcmp 함수의 취약점을 알 수 있는데
: "빈 배열을 넣어 보내면 PHP는 이를 NULL(0)로 해석합니다!"
strcmp 함수 return values를 보면
: Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.
즉, strcmp($a, $b) 를 실행 할 때
$a가 작으면 음수, $b가 작으면 양수,
그리고 $a와 $b가 같으면 0 이 반환된다는 뜻으로
password를 몰라도 strcmp 함수에서
0을 리턴할 수 있는 방법이 있다면
암호 비교 구문을 우회 할 수 있게된다.
비번 strcmp 소드를 다시 보면
strcmp($_POST['password'], $pwd) == 0)
위 설명과 동일한 구조로 작성이 되어있고
password에 빈 배열을 넣어 전송하면
패스워드가 NULL(0)이라고 PHP가 이해하게 되어
조건이 성립되어
로그인 우회에 성공해 302가 뜨면서
dashboard.php로 리다이렉트가 된다!
2-2) LFI
dashboard.php 소스 일부를 보면
$ext 변수 설정이 되어 있는데
기존 경로에 해당 파라미터를 추가해
LFI를 시도하면
(또는)
정상 반영된다.
2-3) RCE
:로그 파일 경로 확인
: 코드 인젝션
User-Agent를 통한 인젝션 시도
: 커맨드 인젝션 결과 확인
핑 날려주면
정상적으로 받아지고
whoami도
정상 수행 가능!
: 리버스 쉘 생성 시도
파일 만들어주고
wget으로 받아주고
실행권한 주고
리스너 기동 후 파일 실행시키면
침투성공!
3. Privilege Escalation
뒤져보면 사용사의 private key가 있고
복사 후 권한을 주고 해당 키로 로그인을 시도하면,
성공
초반 스캐닝 작업에서
nfs가 활성화되어 있었고
exports 파일을 살펴보면
access denied 되었던
/srv/share 경로의 설정이
no_root_squash로 되어있다.
해당 옵션은 클라이언트의 루트 사용자에게
NFS 서버의 파일에 root로 액세스할 수 있는
권한을 부여하는데
'공유 디렉토리는 localhost에서만'
액세스 할 수 있으니 네트워킹 설정을
변경해야 한다.
우선 해당 사용자가 속해있는 그룹을 확인해보고
해당 그룹의 권한이 부여된 파일을 find 명령어로 확인해보니
/etc/hosts 파일이며 해당 파일의 권한을 살펴보니
network 그룹들은 해당 파일을 수정할 수 있단다.
간단히 hosts 파일의 주소를
칼리 주소로 변조한 뒤 저장해주면
우리쪽 IP를 localhost로 인식해
마운트가 가능하고
bash shell을 생성해줄
바이너리를 만들어 컴파일 후
쉐어 디렉터리에 넣어준뒤
SetUID 권한 걸어주고
침투 서버에서
shared 디렉토리 경로로 이동 후
파일을 실행시키면
no_root_squash 설정으로 인해
루트 권한으로 쉘이 실행된다.
끝
'OSCP > Proving Ground' 카테고리의 다른 글
30. Fail (GET TO WORK) - Linux (rsync, ssh, fail2ban) (0) | 2022.08.25 |
---|---|
29. XposedAPI (GET TO WORK) - Linux (HTTP request smuggling) (0) | 2022.08.25 |
27. Roquefort (GET TO WORK) - Linux (0) | 2022.08.18 |
26. Sona (GET TO WORK) - Linux (2) | 2022.08.15 |
25. Nibbles (GET TO WORK) - Linux (0) | 2022.08.15 |