Osori Development Studio

webhacking.kr 1,3,4,31,38 본문

전공쪽/동아리 관련

webhacking.kr 1,3,4,31,38

OSOR2 2021. 2. 8. 18:20

1번

<?php
  include "../../config.php";
  if($_GET['view-source'] == 1){ view_source(); }
  if(!$_COOKIE['user_lv']){
    SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
    echo("<meta http-equiv=refresh content=0>");
  }
?>
<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<?php
  if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>=6) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>5) solve(1);
  echo "<br>level : {$_COOKIE['user_lv']}";
?>
<br>
<a href=./?view-source=1>view-source</a>
</body>
</html>

단순한 php 문제이다. user_lv 이란 쿠키값이 중요하게 작용한다. 코드를 보면 알겠지만 user_lv 쿠키값을 5~6사이값으로 설정하면 쉽게 풀린다. is_numeric 함수는 값이 숫자인지만을 검사하는 함수이기 때문에 소수도 true를 반환한다. 

3번

일단 노노그램이라고 써져 있어서 풀었다. 푸는 법을 몰랐는데 그냥 인터넷에 치니 나왔고, 어렵지 않게 풀 수 있었다. 

클리어를 하면 위 사진과 같은 이 나온다.  

 

 hidden 으로 숨겨진 태그가 있기에 저 value를 한글로 바꾸고 submit을 하니 query error 라는 창이 떴고 sql 쪽이라는 것을 알았다. 

 따라서 쌍따옴표를 통해서 쿼리를 보내봤는데 아주 잘들어갔다.  아마도 쌍따옴표가 아닌 일반 따옴표로 query문이 구성된 것 같았다. 

 ' or 1=1 # 을 value에 넣어서 보내주었더니 풀렸다. 

 

4번

<?php
  include "../../config.php";
  if($_GET['view-source'] == 1) view_source();
?><html>
<head>
<title>Challenge 4</title>
<style type="text/css">
body { background:black; color:white; font-size:9pt; }
table { color:white; font-size:10pt; }
</style>
</head>
<body><br><br>
<center>
<?php
  sleep(1); // anti brute force
  if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);
  $hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'] = $hash;
  for($i=0;$i<500;$i++) $hash = sha1($hash);
?><br>
<form method=post>
<table border=0 align=center cellpadding=10>
<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>
<tr align=center><td>Password</td><td><input name=key type=text size=30></td><td><input type=submit></td></tr>
</table>
</form>
<a href=?view-source=1>[view-source]</a>
</center>
</body>
</html>

key 값이 처음 만들어진 rand+salt 값과 동일하면 문제가 풀린다. 아무래도 brute forcing을 하면 세션이 만료될 것 같았다. ... 여기서 멘붕이 와서 구글에서 살짝 힌트를 얻었다. 레인보우 테이블을 만들어주라고 한다.  

나는 스레드를 쉽게 쓰고 싶어서 c#으로  만들어주었다. 

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;

namespace rainbow
{
    class Program
    {
        public static int count = 0;
        public static String[] table = new string[90000000];
        public static string ByteToHex(byte[] bytes)
        {
            string hex = BitConverter.ToString(bytes);
            return hex.Replace("-", "").ToLower();
        }

        static void makeHash(int num)
        {
            SHA1 sha = new SHA1CryptoServiceProvider();
            String key = num.ToString()+"salt_for_you";
            String result = key;
            for (int i = 0; i < 500; i++)
            {
                byte[] data = sha.ComputeHash(System.Text.Encoding.ASCII.GetBytes(result));
                result = ByteToHex(data);
            }
            table[num-10000000] = result;
        }
        


        static void Main(string[] args)
        {
            Parallel.For(10000000, 100000000, (i) =>
            {
                makeHash(i);
            });
            StreamWriter sw = new StreamWriter("rainbow.csv");
            System.Console.WriteLine("Writing");
            for (int i = 10000000; i < 100000000; i++)
                sw.WriteLine(table[i- 10000000]);
            sw.Close();
        }
    }
}

 

결과적으로 테이블이 성공적으로 만들어졌고 풀 수 있었다. 내 c# 코드를 쓰고 싶은 분들은 저기서 table 배열을 byte 타입으로 바꾸고 result를 byte형식으로 변환해서 기록하고 csv에 적을 때에도 반대로 해주는 것이 램을 2배 아낄 수 있을 것이다. 내 프로그램은 10기가는 쓰는듯 하다. 그리고 저렇게 대용량 csv는 엑셀에서 안열린다. 

31번

랜덤으로 10000~10100 사이의 수로 원하는 ip의 port로 접근 할 수 있다. 커넥션이 연결되면 flag를 전송해준다. 

fsockopen 함수는 php에서 제공하는 소켓 함수이다. 일반 소켓함수와 비슷하게 작동하는데 호스트에 도메인등을 적어줄 수 있고 비동기 처리 기능이 강화되었다. 

 

따라서 자신의 서버에서 그냥 포트 열고 랜덤넘버가 맞을 때까지 계속 돌리면 되는데... 일단 주의 해줄 것이 있었다. 

원래라면 내 노트북에서 연결했겠지만, 지금 wifi 상태여서 포트포워딩 설정하기는 너무 귀찮았고.. gcp 서버로 연결해주었는데..

 

1. 서버측에서는 자신의 내부 ip로 열어야 된다.

2. 방화벽에 설정을 허용해주거나, 그냥 끄고 하는게 속편하다. 

 

<?php
        set_time_limit (0);
        $address = "10.178.0.2";
        $port = 10027;
        $sock = socket_create(AF_INET, SOCK_STREAM, 0);
        socket_bind($sock, $address, $port) or die('Could not bind to address');
        socket_listen($sock);
        $client = socket_accept($sock);
        $input = socket_read($client, 1024);
        echo $input;
?>

위는 내 서버측 코드이다. address를 자신의 내부 ip주소로 바꾸어 사용하거나, 랜선 꼽고 돌리는게 편할지도

연결이 되면 이렇게 flag가 전송된다. 

 

38번

이런 페이지로 접속이 된다. 그리고 admin.php 라는곳을 확인할 수 있는데(소스코드에서 주석 힌트)

로그인을 admin으로 하려고 하면 you are not admin 이라는 문구가 뜬다. 

 

 

이렇게 로그인을 시도한 기록이 남는다. 여기에 admin으로 로그인한 로그를 남겨주면 되는 것 같다. 

이런 시도를 해보았는데, 줄바꿈을 하면 어떨까 해서 input을 textarea로 바꾸고 다시 시도해주었더니 풀렸다. 뭐지?

 

 

'전공쪽 > 동아리 관련' 카테고리의 다른 글

DiceCTF Babier CSP, MissingFlavortext  (0) 2021.02.09
webhacking.kr 26,54,27,36,28  (0) 2021.02.02
webhacking.kr  (0) 2021.01.27
sfctf winter write up  (0) 2021.01.26
sfw8 write up  (0) 2021.01.11