CTF 죽었어, CTF 만세!

나는 거짓말을 하고 싶지 않다. 내가 처음으로 메이저리그 해커의 CTF (카란과 MLH에 있어서는 모두 거대한 도구) 에 참가했을 때, 나는 이렇게 많은 것을 배울 줄 몰랐다.💯 발생시켜줘서 고마워요.내가 처음으로 CTFs와 상호작용을 한 것은 올해 초였다. 당시에 나는 어디에나 있는 채널을 보았다. (만약 네가 그들의 어떤 내용도 보지 않았다면, 너는 놓쳤을 것이다.)나한텐 너무 모호하고 복잡해.내가 해결한 첫 번째 진정한 CTF'문제'는 카란이 우리에게 보낸 것이다(그의 부하라고 할 수 있습니까?) -로고가 있는 HTML 페이지를 소스 코드에 직접 포함합니다.이런 문제들을 해결하는 것은 당신에게 흥분감을 가져다 줄 수 있지만, 당신은 자신이 어떤 상황에 빠졌는지 모른다. 모든 문제 (d) 는 복잡한 문제로 변하고, 모든 문제는 점점 만족스러운 해결 방안을 가지고 있다.이것은 단지 이야기의 시작일 뿐이다.
CTFs를 새로 접한 사람은 누구나 알 수 있을 것이다. Hack the Box. 그리고 그들의 슈퍼 보안 시스템을 이용하여 계정을 만들고, 이를 현실화시키는 도전을 할 것이다. 그래, 마찬가지다.하지만 이 MLH CTF, 첫 번째 MLH 연구원의 CTF에 대해 이야기해 봅시다.나는 거짓말을 하고 싶지 않지만, 우리가 앞의 몇 가지 문제를 해결할 때, 우리는 난관을 가볍게 넘길 자신이 있다. 물론, 나중에는.
그래서 오늘 나는 내가 생각하는 가장 독특한 도전(내가 좋아하는 도전은 아니다)에 대해 이야기할 것이다.🥱

잡다한 항목.


Silent Night, Holy Night, All is calm all is well. 
Well, jingle bells are all around the town and Karan is
reminiscing the time he spent with Santa last year.
Going through images and reviews he left around town,
he wants you to visit and have a glimpse of his fun times.
The ticket that leads you to the place is within the
registration email. 
Category: Misc.


"...해당 장소로 안내하는 입장권은
'메일 등록'은 필터로 메일을 검색할 수 있다는 아주 뚜렷한 힌트입니다.

답장 메일을 클릭하고 메일 ID에 마우스를 걸면 사용자의 UID를 포함하는 동적 홈 카드를 받을 수 있습니다.그리고 다음에 어디로 갈지 근거 있게 추측해야 하지만, 사실 산타클로스 마을의 동영상이 있는데, Gmail 주소가 필요하면 다음에 어디로 갈지 알려줘야 한다. 물론 구글 지도도.사실 조사 과정에서 마을의 평론(많은 사람들처럼), 심지어 카란의 평론(많은 사람들도 그렇다)까지 찾아볼 수 있다.
이 방법은 기본적으로 방문https://www.google.com/maps/contrib/<user-id>을 통해 평론을 찾고(응, 완전히 그렇지는 않아) 사용자의 지도를 방문하는 데 기여한다.
그러나 말했듯이 이것은 작은 도전이 아니라 복잡한 도전이다.
두 번째 부분은 은사술에 대한 도전으로 아직 명확하지 않다.하지만 때로는 뭐든지 해봐야 할 때가 있다.이 로고는 실제로 댓글과 함께 올라온 그림 중 한 장(총 두 장)에 숨겨져 있다(총 두 장).나는 마침내 PCA로 깃발을 비교적 쉽게 추출할 수 있었다. 왜냐하면 깃발은 어디든지 있을 수 있기 때문이다.

그곳에서 우리는 국기를 찾았다-mlh{M3rry_Chr1stmas}🆙

AWS 취약성


Will has been tasked with collecting feedbacks for the CTF. Instead of using online form he made this app as he wanted to get his hands dirty with App dev and DevOps.
[Link to download app]
Category: Reversing
이번에 시간이 좀 걸렸는데, 왜냐하면 우리 팀에는 APK가 역컴파일한 자원이 없기 때문이다.우리 팀 구성원 중 한 명은 ADBlogcat를 보유하고 있는데 이것은 우리가 첫 번째 정보 블록을 발견하여 도전의 내용을 깊이 이해하도록 하는 곳이다.솔직히 이 문제는 가장 직관적이지 않고 초보자들에게 가장 불친절한 해결 방안 중 하나로 상당히 복잡한 AWS 지식이 필요하다.만약 어떤 AWS SDK 기능이나 유사flaws.cloud을 사용한 적이 있다면, 이것은 매우 쉬울 수 있지만, 그 외에 나는 이것이 매우 엄격하다고 생각한다.logcat를 사용하면 "피드백 보내기"를 누르면 응용 프로그램이 무엇을 하고 있는지 확인할 수 있습니다.
2020-12-19 01:38:44.558 8550-9744/? D/AmazonS3Client: Key: feedback/.json; Request: PUT https://<...>.s3.ap-south-1.amazonaws.com /feedback/.json 
2020-12-19 01:38:44.559 8550-9744/? D/KeyProvider23: AndroidKeyStore contains keyAlias com.amazonaws.mobile.client.aesKeyStoreAlias
2020-12-19 01:38:44.559 8550-9744/? D/KeyProvider23: Loading the encryption key from Android KeyStore.
2020-12-19 01:38:44.561 8550-9744/? D/KeyProvider23: AndroidKeyStore contains keyAlias com.amazonaws.mobile.client.aesKeyStoreAlias
2020-12-19 01:38:44.561 8550-9744/? D/KeyProvider23: Loading the encryption key from Android KeyStore.
2020-12-19 01:38:44.563 8550-9744/? D/KeyProvider23: AndroidKeyStore contains keyAlias com.amazonaws.mobile.client.aesKeyStoreAlias
2020-12-19 01:38:44.563 8550-9744/? D/KeyProvider23: Loading the encryption key from Android KeyStore.
2020-12-19 01:38:44.577 8550-9744/? D/KeyProvider23: AndroidKeyStore contains keyAlias com.amazonaws.mobile.client.aesKeyStoreAlias
2020-12-19 01:38:44.578 8550-9744/? D/KeyProvider23: Loading the encryption key from Android KeyStore.
2020-12-19 01:38:44.578 8550-9744/? D/AWSMobileClient: Inspecting user state details
2020-12-19 01:38:44.580 8550-9744/? D/AWSMobileClient: waitForSignIn: userState:GUEST
2020-12-19 01:38:44.580 8550-9744/? D/KeyProvider23: AndroidKeyStore contains keyAlias com.amazonaws.android.auth.aesKeyStoreAlias
2020-12-19 01:38:44.580 8550-9744/? D/KeyProvider23: Loading the encryption key from Android KeyStore.
2020-12-19 01:38:44.593 8550-9744/? D/KeyProvider23: AndroidKeyStore contains keyAlias com.amazonaws.mobile.client.aesKeyStoreAlias
2020-12-19 01:38:44.593 8550-9744/? D/KeyProvider23: Loading the encryption key from Android KeyStore.
2020-12-19 01:38:44.606 8550-9744/? D/AWS4Signer: AWS4 Canonical Request: '"PUT
    /feedback/.json

    content-md5:ArXoeuja4WV6fSZ9+AW9jQ==
    host:<...>.s3.ap-south-1.amazonaws.com
    x-amz-content-sha256:STREAMING-AWS4-HMAC-SHA256-PAYLOAD
    x-amz-date:20201218T200844Z
    x-amz-decoded-content-length:33
    x-amz-security-token:<...truncated...>"
간단히 말하면, 이 프로그램은 우리의 피드백을 feedback.json 파일로 S3에 넣는다.POST를 제외한 모든 요청이 저희AccessDenied에게 들어왔기 때문에 ACL이 엄격하다는 것이 분명합니다. 그래서 POST의 검증은 항상 이상합니다. 저희가 요구를 충족시킨 후에도 서버에서 똑같은 검증 오류가 발생했습니다.결국 나는 이번 공격을 포기했다.

응용 프로그램 반전


이것은 매우 짜증스럽다. 우리는 자원이 없기 때문에, 나는mobSF와Genymotion을 설치하기 시작했다. 이 앱은 보기에 매우 좋고, 검색 추적기와 악성 소프트웨어 같은 보안 분석도 많이 했다. 그러나 이런 상황에서, 이것은 (거의) 무의미하다.Java 파일에는 아무것도 없습니다.Genymotion은 작동하지 않습니다.
그리고 저는 온라인 컴파일러decompiler.com를 계속 사용했습니다. 이것은 전형적인 JADX 컴파일러입니다. 저는 resources 폴더(그리고 Java 파일)에 접근할 수 있습니다. 이것은 빈틈을 이용한 작업에 필수적이라고 생각합니다.흥미로운 것은, 비록 내가 전날에 같은 파일을 열었지만, 나는 그것들이 사용할 수 있는 증거라는 것을 깨닫지 못했다는 것이다.Resources 폴더에서 파일res이 포함된 raw/awsconfiguration.json 폴더를 보았습니다.
{
"CredentialsProvider": {
  "CognitoIdentity": {
    "Default": {
      "PoolId": "ap-south-1:<...>",
      "Region": "ap-south-1"
    }
  }
},
  "S3TransferUtility": {
    "Default": {
      "Bucket": "<...>",
      "Region": "ap-south-1"
    }
  }
}
AWS 이론을 조금 읽고 나서 (네, 정말...)우리는 Cognito 표지 풀은 반드시 경험증이 없어야 한다고 생각합니다. 다른 증빙서류가 교환되지 않았기 때문에 관건은 우리의 ID 풀에서 ID를 얻어 STS 영패로 교환하고 이 증빙서류로 S3에 접근하는 것입니다.비록 나는 이 일에 있어서 완전히 정확하지만, 나는 여전히 내가 아니라면 무슨 일이 일어날지 알고 싶다. 그러나 어쨌든.🤷‍♂️
노드 스크립트를 작성하고 예시 코드에 따라 필요한 증거를 만들기 시작했습니다. 예상한 대로 코그니트는 우리에게 정확한 접근 카드를 제공했지만, 코르스 때문에 S3에서 자원을 검색하는 데 실패했습니다.내가 미쳤을 때 한 동료가 boto3로 각본을 썼다.아, 그리고 노드를 어떻게 쓰는지 모르겠어요.js, 그래서 이게 문제일 수도 있어요.
from boto3.session import Session
from io import BytesIO

ACCESS_KEY='ASIAKEY'
SECRET_KEY='mfXpSECRETKEYkZGTOonrJ'
SESSION_KEY = 'IQoJb3JpZSSESSIONKEYzWZg'

session = Session(aws_access_key_id=ACCESS_KEY,
                  aws_secret_access_key=SECRET_KEY,
                  aws_session_token=SESSION_KEY)
s3 = session.resource('s3')
your_bucket = s3.Bucket('<...>')

for obj in your_bucket.objects.all():
    key = obj.key
    body = obj.get()['Body'].read()
    print(body)
그리고 S3의 첫 번째 항목은 로고입니다.

우리는 국기를 되찾았다mlh{th1s_i5_why_i_d0nt_l1k3_devops}.🚀

이론


Cryptography is beautiful, isn't it? You just have to use it right.
secret-flag.png.crypt encrypt.c
이 도전은 거짓말을 할 줄 모르는 또 다른 차원이다.내 말은, 경험이 풍부한 CTF 직원들에게는 중등(?)이 될 것이다.고작 우리 팀에게는 재난이었다. 왜냐하면 우리는 모두 초보자이기 때문이다.하지만 최고는 우리가 결국 이 문제를 해결했고, CTF가 끝나갈 무렵 동점 골을 터뜨렸지만 다른 팀보다 4분 늦었다.아주 극적이에요. 맞아요.
나는 이 감정과 심각한 애증 관계를 가지고 있지만, 아마도 이 감정에서 가장 많이 배웠을 것이다.이 도전을 해결하는 첫 번째 단계는 정교한 이쑤시개로 원본 코드를 분해하는 것이고, 두 번째 단계는 PNG가 어떻게 작동하는지 이해하는 것이다.나는 나 자신이기 때문에 이렇게 하지 않고 즉시 각종 가능한 공격, 이미 알고 있는 명문, 선택한 명문, 금지된 등등을 깊이 연구했다(응, 이것은 약간 금지된 이미 알고 있는 명문 공격 같다).
그래서, 첫걸음!연구하다.그룹 암호화의 작업 원리를 읽었는데, 더 중요한 것은 계수기 모드였다. 이것은 내가 위키백과에서 읽었다는 것을 의미한다. bunch of pages🥱 하지만 정말 값진 일이다.특히, 나는 이미 알고 있는 명문 공격에 관한 단락을 알아차렸지만, 나는 아무것도 몰랐다. 왜냐하면, 그래, 암호학, 아미리트이기 때문이다.
그러나 나는 이런저런 것을 읽은 적이 있다. 한 번은pad공격, 두 번은pad공격, 이런 것들(그래, 나는 무지에 잠겼다).첫 번째 프롬프트가 해제될 때까지

the CTR implementation is buggy


비록 이 점을 알고 있지만, 나는 지금까지 오류가 무엇인지 제대로 알지 못했다. 왜냐하면 나는 오류가 사실상 코드 자체라고 가정했기 때문이다. 코드 자체는 오류이기 때문이다. 왜냐하면 그것은 표준 리눅스 발행판에서 사용할 수 없는 OpenBSD 라이브러리로 작성되었기 때문이다.네?(예, 스크립트를 고치고 작성하는 데 몇 시간이 걸립니다.)
결국, 나는 스크립트에서 inc_counter() 함수를 보았고, 매우 모호한 의심이 있었다. 만약 그것이 정말 정확하게 썼다면, 그것이 이렇게 썼기 때문에, 나는 그것이 계수기를 바꾸지 않았다는 것을 매우 확신했다. (이것은 분명히 진정한 문제가 아니다.)문제는 ctr_block_encrypt() 함수 매개 변수가 바늘을 가리키는 것이 아니라 struct의 복사본을 수신하는 것이다.
ctr_block_encrypt(struct ctr_state state, uint8_t *in, uint8_t *out)`
{
    ...
}
그래서 나는 내가 가장 좋아하는 디버거fprintf를 사용하여 디버깅을 하기 시작했다.나는 그것들을 함수 호출에 포장했다. 봐라, 증량이 없다.이 임시 설비는 재사용 중이다.이것은 우리에게 일시적으로 중용되는 공격 세계를 열어주었다.그 다음 부분은 실제적으로 더 고통스러웠다. 명문을 어떻게 추측해서 실제 키 흐름을 얻었는지, 그 다음에 파일을 복호화했는지.

PNG 뭐라고요?


나는 이것이 틀림없이 파일을 복호화하는 방법일 것이라고 확신한다. 왜냐하면 우리는 그것들이 모두 유일한 파일 서명을 가지고 있다는 것을 알고 있기 때문이다.W3C PNGspec site에서 16진수 값을 검색하고 작업을 시작했습니다.
crib 드래그 공격("crib"은 이미 알고 있거나 추측한 명문으로 이미 알고 있는 명문 공격의 변체가 된다)을 사용하여 키의 앞부분을 계산해 냈습니다5c 92 d5 10 d0 63 20 9d 00 00 00 00 00 00 00.그러나 나는 키의 나머지 부분에 정말 걸렸거나, 그렇게 생각했다. 그러나 나는 모든 PNG 파일에 적어도 두 개의 핵심 블록이 있다는 것을 발견했다. 바로 IHDR와 IEND였다.
IEND (+ CRC) 바이트를 사용하면 crib 드래그를 사용하여 더 많은 키 5c 92 d5 10 d0 63 20 9d 34 cf 24 95 00 00 00 00 를 얻을 수 있습니다. 마지막으로, 나머지는 IHDR를 적당한 블록에 넣고 키 전체를 추측하도록 합니다.

그리고 우리는 복호화된 바이트를 데이터베이스에 저장할 것이다.txt 파일, PNG 규범에 맞게 파일을 정리하고 계수기 바이트를 삭제한 다음 로고를 검색하기 위해 엽니다!

우리는 마침내 자신의 눈으로 국기를 볼 수 있게 되었다mlh{n0nc3_m34ns_numb3r_u53d_ONCE}.이것은 정말 감동적인 여정의 끝이었다.🏁

결과가 어떠한가



비록 이것은 초보자를 대상으로 하는 CTF였지만 그 발전에 따라 매우 재미있고 복잡해졌다. 우리가 잘하는 이유는 말할 것도 없이 나의 뛰어난 동료인 아시, 로한과 나의 동료 때문이다.우리는 모든 도전에 부딪혔는데, 결국, 이것이야말로 가장 중요한 것이다.

좋은 웹페이지 즐겨찾기