[▒] 보안
포트포워딩의 냄새가 첫 줄을 보자마자 나네요 ㅎㅎ 10000 ~ 10100 사이의 포트를 개방해주면 될거같습니다. 저희 집 공유기는 구식이라 여러 포트를 하나의 포트로 모아주진 못했어요. 그래서 10000 ~ 10100 포트로 들어오는 것들을 모두 다시 가상머신 안의 UBUNTU 10000 ~ 10100 포트로 연결시켜줬습니다 ㅎㅎ VMware PRO를 사용했고 공유기는 SK 입니다. 이번 문제는 딱히 적을게 없어서 포트포워딩 하는 방법으로 마치겠습니다. SK 공유기에서 포트포워딩 하는 방법 1) VMware PRO를 실행한다. (VMware workstation은 어떻게 하는지 모르겠어요,,) 2) 왼쪽 상단의 Edit 클릭 3) Virtual Network Editor 클릭 4) 오른쪽 하단의 Cha..
개인 디렉토리와 index.php 파일 소스를 보여주는 링크가 보이네요. 가서 봅시다! chall30.chall30_answer에 있는 flag를 가져와서 그 값이 존재하다면 /flag를 include 합니다. 처음에는 뭘 하라는건지 몰랐지만, 자세히 보니 평소와는 다르게 mysqli_connect()에 인자가 없습니다. mysqli_connect()의 함수 원형을 볼까요? 인자가 없어도 되는것이 디폴트 값이 있었기 때문이었습니다. ini_get 함수는 무엇일까요? 먼저, php.ini 파일을 알아야합니다. php.ini란 php의 설정 파일로, 변경하게 되면 서버의 모든 php 스크립트에 설정 내용이 반영됩니다. 한마디로 수정파일의 개념입니다. PHP를 처음 설치하고 나서 제대로 설치가 완료되었는지 확..
FPO란 FPO는 Saved Frame Pointer의 최하위 1 바이트를 오염시킴으로써 발생되는 취약점입니다. 이 기법을 사용하기 위해서는 메인 함수 이외에 서브 함수가 필요합니다. 공격 조건 1. SFP 영역에서 1 바이트 오버플로우가 반드시 일어난다. 2. 메인 함수 이외에 서브 함수가 있다. 공격 과정 스택 프레임 에필로그 과정을 숙지하고 있다는 것을 전제로 합니다. 어셈블리어는 Intel x86을 사용하였으며, 이 글에서 표현한 주소는 임의의 주소입니다. 다음과 같은 코드가 있다고 가정합시다. #include void Vuln(char *sfp) { char buffer[40]; strncpy(buffer, sfp, 41); printf("%s", buffer); } int main(int ar..
파일 선택을 통해 파일을 올린 뒤 제출 버튼을 클릭하면, 이와 같이 파일이 올라가죠. 여기서 다음과 같이 유추해낼 수 있을 것 같네요. DB에 insert 하기 위해 질의되는 쿼리문 1. insert into '??' values(time or ip, ip or time, filename) 2. insert into '??' values(time or ip, filename, ip or time) 3. insert into '??' values(filename, time or ip, ip or time) 각각의 경우를 테스트 해봅시다. 1번은 탈락! 2번도 탈락! 3번 성공! 하지만, 파일이 등록되지 않는 이유가 무엇일까요? 파일 업로드에 성공했을 때 나타나는 ip를 패킷에 실어 보내보겠습니다. 두번째 ..
- 추가 예정
파일을 업로드할 수 있네요. 같은 디렉터리 안에 있는 flag.php 파일을 읽으면 문제가 풀리는 것 같습니다. 하지만, flag.php 파일을 들여다 봐도 아무것도 나오지 않습니다. php 확장자를 엔진이 실행함으로써 소스코드를 보여주고 있지 않은 것인데요, php 확장자를 해석하지 않도록 엔진을 꺼야겠습니다. appache 서버라면, .htaccess 파일을 통해 서버의 동작 흐름을 변경할 수 있습니다. 이에 Allow Overwrite가 true 라면, 각 디렉터리에서 동작의 흐름을 각각 다르게 할 수 있는데요, 이를 이용해보겠습니다. php_flag engine off 이를 .htaccess 파일에 작성한 뒤 업로드하고, flag.php 파일을 읽으면 됩니다.
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ sql injection 공격을 통해 id 값을 'admin'으로 만들면 되겠네요. 괄호를 여는 것이 검열되네요. 또한, '#'을 통한 주석처리도 검열되어있습니다. 그러면 ';NULL'을 사용해서 쿼리문의 끝이라고 판단하게 만들거나 '--'을 통한 주석처리를 하면 될 것 같습니다. 또한, 공백은 탭으로 우회하면 됩니다. '='이 검열되므로 like를 사용하겠습니다. payload는 이렇습니다. case ';NULL') 0)%09or%09no%09like%092;%00 case '--') 0)%09or%09no%09like%092--%09
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ GET 방식의 파라미터 id의 값이 'admin'이면 해결되는 문제네요. 그런데 잘 보면 urldecode라는 함수를 id에 사용하고 있습니다. 이는 GET 방식에서 한 번 urldecode 된 것을 다시 한 번더 urldecode를 하겠다는 의미이죠. 따라서, admin을 두 번 urlencode 해봅시다. 1) %61%64%6d%69%6e 2) %2561%2564%256d%2569%256e 이제 이 값을 URI의 id 값으로 넣어주면~
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ 디렉터리의 내부를 보여주고 있는 모습입니다. flag.php에 FLAG가 있을 것이라고 예상되고, hello.php와 index.php가 있네요. URI 파라미터에서 file 이름으로 hello의 값이 전달되니 hello.php의 파일내용이 나왔습니다. 이는 GET 방식의 file이라는 이름의 파라미터를 받아 여기에 '.php'를 붙여 file_get_contents와 같은 함수를 사용하는 것으로 추측할 수 있습니다. php 파일이 해석되어 echo를 통해 문자열이 나타난 것 같습니다. 하지만, FLAG는 변수로 저장되어있겠죠. 그렇다면 flag.php 파일의 소스코드를 직접 봐야할 것 같습니다. 이럴 때 사용하는 것이 wrapper죠. 파일 안의 모든 ..