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 설정으로 인해

루트 권한으로 쉘이 실행된다.

 

728x90
반응형

+ Recent posts