머신 러닝으로 15 분 안에 CAPTCHA 시스템을 깨는 방법

세계에서 가장 인기있는 Wordpress CAPTCHA 플러그인을 해킹합시다.

웹 사이트에 액세스하기 전에 입력해야하는 텍스트가 포함 된 성가신 이미지 인 CAPTCHA를 누구나 싫어합니다. CAPTCHA는 사용자가 실제 사람임을 확인하여 컴퓨터가 자동으로 양식을 작성하지 못하도록 설계되었습니다. 그러나 딥 러닝과 컴퓨터 비전의 부상으로 이제는 쉽게 패배 할 수 있습니다.

저는 Adrian Rosebrock 의 훌륭한 책 Deep Learning for Computer Vision with Python 을 읽고 있습니다. 이 책에서 Adrian은 기계 학습을 사용하여 E-ZPass New York 웹 사이트에서 CAPTCHA를 우회하는 방법을 설명합니다.

Adrian은 CAPTCHA 이미지를 생성하는 애플리케이션의 소스 코드에 액세스 할 수 없었습니다. 시스템을 깨기 위해 그는 수백 개의 예제 이미지를 다운로드하고 수동으로 해결하여 시스템을 훈련시켜야했습니다.

하지만 우리가 소스 코드에 접근 할 수있는 오픈 소스 보안 문자 시스템을 깨고 싶다면 어떻게해야할까요?

나는 갔다 WordPress.org 플러그인 레지스트리 와 "보안 문자"를 검색. 최상위 결과는 "Really Simple CAPTCHA"이며 1 백만 개 이상의 활성 설치가 있습니다.

그리고 무엇보다도 소스와 함께 제공됩니다! CAPTCHA를 생성하는 소스 코드가 있으므로 쉽게 깨뜨릴 수 있습니다. 일을 좀 더 어렵게 만들기 위해 우리 자신에게 시간 제한을 부여합시다. 이 CAPTCHA 시스템을 15 분 이내에 완전히 깰 수 있습니까? 해 보자!

중요 사항 : 이것은 'Really Simple CAPTCHA'플러그인이나 그 저자에 대한 비판이 아닙니다. 플러그인 작성자는 더 이상 안전하지 않다고 말하고 다른 것을 사용할 것을 권장합니다. 이것은 재미 있고 빠른 기술적 도전을 의미합니다. 하지만 나머지 1 백만 명 이상의 사용자 중 하나라면 다른 것으로 전환해야 할 수도 있습니다. :)

도전

공격 계획을 세우기 위해 Really Simple CAPTCHA가 어떤 종류의 이미지를 생성 하는지 살펴 보겠습니다 . 데모 사이트에서 다음과 같이 표시됩니다.

데모 보안 문자 이미지

좋습니다. CAPTCHA 이미지는 네 글자로 보입니다. PHP 소스 코드에서 다음을 확인해 보겠습니다.

네, 네 가지 다른 글꼴을 무작위로 혼합하여 4 글자 CAPTCHA를 생성합니다. 그리고 사용자 혼동을 피하기 위해 코드에 "O"또는 "I"를 사용하지 않음을 알 수 있습니다. 그것은 우리가 인식해야 할 총 32 개의 가능한 문자와 숫자를 남깁니다. 문제 없어요!

지금까지 경과 한 시간 : 2 분

우리의 도구 세트

더 진행하기 전에이 문제를 해결하는 데 사용할 도구를 언급하겠습니다.

파이썬 3

Python은 머신 러닝 및 컴퓨터 비전을위한 훌륭한 라이브러리가있는 재미있는 프로그래밍 언어입니다.

OpenCV

OpenCV는 컴퓨터 비전 및 이미지 처리에 널리 사용되는 프레임 워크입니다. OpenCV를 사용하여 CAPTCHA 이미지를 처리합니다. Python API가 있으므로 Python에서 직접 사용할 수 있습니다.

케 라스

Keras는 Python으로 작성된 딥 러닝 프레임 워크입니다. 최소한의 코딩으로 심층 신경망을 쉽게 정의, 훈련 및 사용할 수 있습니다.

TensorFlow

TensorFlow는 기계 학습을위한 Google의 라이브러리입니다. 우리는 Keras로 코딩 할 것이지만 Keras는 실제로 신경망 로직 자체를 구현하지 않습니다. 대신 Google의 TensorFlow 라이브러리를 사용하여 무거운 작업을 수행합니다.

좋아, 다시 도전!

데이터 세트 만들기

기계 학습 시스템을 훈련하려면 훈련 데이터가 필요합니다. CAPTCHA 시스템을 깨기 위해 다음과 같은 훈련 데이터가 필요합니다.

WordPress 플러그인에 대한 소스 코드가 있으므로 수정하여 각 이미지에 대한 예상 답변과 함께 10,000 개의 CAPTCHA 이미지를 저장할 수 있습니다.

몇 분 동안 코드를 해킹하고 간단한 'for' 루프 추가 한 후 훈련 데이터가있는 폴더가 생겼습니다. 파일 이름으로 각각에 대한 정답이있는 10,000 개의 PNG 파일이 있습니다.

이것이 제가 작동하는 예제 코드를 제공하지 않는 유일한 부분입니다. 우리는 교육을 위해이 작업을 수행하고 있으며 실제로 나가서 실제 WordPress 사이트에 스팸을 보내는 것을 원하지 않습니다. 그러나 결과를 복제 할 수 있도록 마지막에 생성 한 10,000 개의 이미지를 제공하겠습니다.

지금까지 경과 한 시간 : 5 분

문제 단순화

이제 훈련 데이터 를 얻었으므로이를 직접 사용하여 신경망을 훈련 시킬 수 있습니다.

훈련 데이터가 충분하면이 접근 방식이 효과가있을 수 있지만 문제를 훨씬 더 간단하게 해결할 수 있습니다. 문제가 간단할수록 학습 데이터가 적고 문제를 해결하는 데 필요한 계산 능력이 줄어 듭니다. 결국 15 분 밖에 남지 않았습니다!

다행히 CAPTCHA 이미지는 항상 4 개의 문자로만 구성됩니다. 각 문자가 별도의 이미지가되도록 이미지를 분리 할 수 ​​있다면 한 번에 하나의 문자를 인식하도록 신경망 만 훈련하면됩니다.

10,000 개의 트레이닝 이미지를 살펴보고 Photoshop에서 수동으로 개별 이미지로 분할 할 시간이 없습니다. 며칠이 걸리고 남은 시간은 10 분입니다. 그리고 CAPTCHA는 문자를 다른 수평 위치에 무작위로 배치하여이를 방지하기 때문에 이미지를 동일한 크기의 네 개의 청크로 분할 할 수 없습니다.

각 이미지의 문자는 무작위로 배치되어 이미지를 분할하기가 조금 더 어렵습니다.

다행히도이를 자동화 할 수 있습니다. 이미지 처리에서 우리는 종종 같은 색상을 가진 픽셀의 "블럭"을 감지해야합니다. 이러한 연속 픽셀 얼룩 주변의 경계를 윤곽선 이라고 합니다. OpenCV에는 이러한 연속 영역을 감지하는 데 사용할 수 있는 내장 findContours () 함수가 있습니다.

따라서 원시 보안 문자 이미지로 시작합니다.

그런 다음 이미지를 순수한 흑백 (t hresholding 이라고 ) 으로 변환 하여 연속 영역을 쉽게 찾을 수 있습니다.

다음으로 OpenCV의 findContours () 함수를 사용하여 동일한 색상의 연속적인 픽셀 얼룩을 포함하는 이미지의 개별 부분을 감지합니다.

그런 다음 각 영역을 별도의 이미지 파일로 저장하는 간단한 문제입니다. 그리고 각 이미지에는 왼쪽에서 오른쪽으로 4 개의 문자가 포함되어야한다는 것을 알고 있으므로 해당 지식을 사용하여 저장할 때 문자에 레이블을 지정할 수 있습니다. 순서대로 저장하는 한 각 이미지 문자를 적절한 문자 이름으로 저장해야합니다.

하지만 잠시만 요. 문제가 생겼습니다! 때때로 CAPTCHA에는 다음과 같이 겹치는 문자가 있습니다.

즉, 두 글자를 하나의 영역으로 결합하는 영역을 추출하게됩니다.

이 문제를 처리하지 않으면 잘못된 학습 데이터가 생성됩니다. 우리는 실수로 기계가 두 개의 뭉개진 글자를 하나의 글자로 인식하도록 가르치지 않도록 이것을 수정해야합니다.

여기서 간단한 해킹은 단일 윤곽 영역이 높이보다 훨씬 더 넓다면 아마도 두 글자가 함께 뭉개 졌다는 것을 의미합니다. 이 경우 결합 된 문자를 중간에서 절반으로 나누고 두 개의 개별 문자로 처리 할 수 ​​있습니다.

키보다 훨씬 더 넓은 영역을 반으로 나누고 두 글자로 처리합니다. 해키이지만 이러한 CAPTCHA에서는 잘 작동합니다.

이제 개별 문자를 추출하는 방법이 있으므로 보유한 모든 CAPTCHA 이미지에서 실행 해 보겠습니다. 목표는 각 문자의 다양한 변형을 수집하는 것입니다. 모든 편지를 자체 폴더에 저장하여 정리할 수 있습니다.

다음은 모든 문자를 추출한 후 내 "W"폴더의 모습입니다.

10,000 개의 CAPTCHA 이미지에서 추출한 "W"문자 중 일부입니다. 결국 1,147 개의 서로 다른 "W"이미지를 얻었습니다.

지금까지 경과 한 시간 : 10 분

신경망 구축 및 훈련

단일 문자와 숫자의 이미지 만 인식하면되므로 매우 복잡한 신경망 아키텍처가 필요하지 않습니다. 문자를 인식하는 것은 고양이와 개와 같은 그림과 같은 복잡한 이미지를 인식하는 것보다 훨씬 쉬운 문제입니다.

두 개의 컨볼 루션 레이어와 두 개의 완전 연결 레이어가있는 간단한 컨볼 루션 신경망 아키텍처를 사용합니다.

컨볼 루션 신경망의 작동 방식과 이미지 인식에 이상적인 이유에 대해 자세히 알고 싶다면 Adrian의 책 이나 이전 기사를 확인하십시오 .

이 신경망 아키텍처를 정의하려면 Keras를 사용하여 몇 줄의 코드 만 있으면됩니다.

이제 우리는 그것을 훈련시킬 수 있습니다!

훈련 데이터 세트를 10 회 통과 한 후 거의 100 % 정확도를 달성했습니다. 이 시점에서 우리는 원할 때마다이 보안 문자를 자동으로 우회 할 수 있어야합니다! 우리는 해냈다!

경과 시간 : 15 분 (후유!)

훈련 된 모델을 사용하여 보안 문자 풀기

이제 훈련 된 신경망이 있으므로 실제 CAPTCHA를 깨는 데 사용하는 것은 매우 간단합니다.

  1. 이 WordPress 플러그인을 사용하는 웹 사이트에서 실제 CAPTCHA 이미지를 가져옵니다.
  2. 훈련 데이터 세트를 만드는 데 사용한 것과 동일한 접근 방식을 사용하여 CAPTCHA 이미지를 4 개의 개별 문자 이미지로 분할합니다.
  3. 신경망에 각 문자 이미지에 대해 별도의 예측을 요청하십시오.
  4. 보안 문자에 대한 답으로 4 개의 예상 문자를 사용하십시오.
  5. Hijinks가 계속됩니다!

또는 명령 줄에서 :

그것을 시도하십시오!

직접 시도하고 싶다면 여기에서 코드를 가져올있습니다 . 여기에는 10,000 개의 샘플 이미지와이 기사의 각 단계에 대한 모든 코드가 포함되어 있습니다. 실행 방법에 대한 지침은 포함 된 README.md 파일을 확인하십시오.

2019 년 5 월 2 일 업데이트 : OpenCV 4는 코드에 사용 된 함수 중 하나의 API를 변경했습니다. OpenCV 4를 사용하는 경우 예제 코드에서 한 줄을 변경해야합니다.

# Change this line:
contours = contours[0] if imutils.is_cv2() else contours[1]
# To this:
contours = contours[1] if imutils.is_cv3() else contours[0]

이 기사가 마음에 드 셨다면 Machine Learning is Fun에 가입하는 것을 고려해보십시오! 뉴스 레터:

당신은 또한 트위터에 나를 따를 수 @ageitgey , 저에게 직접 이메일 이나 링크드 인에 나를 찾을 수 있습니다 . 기계 학습을 통해 귀하 또는 귀하의 팀을 도울 수 있으면 귀하의 의견을 듣고 싶습니다.

Suggested posts

머신 러닝으로 음악 앱 이탈 예측 : Sparkify 프로젝트

머신 러닝으로 음악 앱 이탈 예측 : Sparkify 프로젝트

이 프로젝트에서는 Udacity Data Scientist 트랙 졸업 프로젝트 인 음악 앱 Sparkify의 이탈 모델링에 대해 설명합니다. 이 프로젝트의 코드는 내 githıb 계정에서 찾을 수 있습니다 : https : // github.

“인공 일반 지능”이란 무엇입니까?

“인공 일반 지능”이란 무엇입니까?

일부 : 인공 일반 지능 소개. “어딘가에 놀라운 것이 알려지기를 기다리고 있습니다.