[ML][Automation]보안문자(Captcha) 우회하기

JOOHAN LEE·2021년 6월 14일
1

1. Captcha란

CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart / CAPTured CHAracter)는 사용자가 컴퓨터인지 사람인지 판별하기 위한 튜링테스트이다.

CAPTCHA는 기계는 인식할 수 없으나 사람은 쉽게 인식할 수 있는 텍스트 혹은 이미지를 통해 사람과 기계를 구별하는 프로그램으로, 텍스트 및 이미지를 왜곡시켜 기계 혹은 사람은 판별할 수 있으나 인공지능은 판별할 수 없도록 프로그램을 만든다.

2. Captcha 우회하기

캡챠를 우회하는 방법에는 OCR을 통한 텍스트 인식, 캡차의 음성을 문자로 변환시켜주는 Speech-to-Text API 를 활용하는 방법이 있을 수 있다.


기계를 판별하기 위한 튜링테스트이지만 인공지능 기술이 발달함에 따라 캡챠로 봇과 사람을 구별하기 또한 어려워지고 있다고 한다.

일례로 구글의 리캡챠를 메릴랜드 대학의 연구원이 구글의 스피치 투 텍스트 API를 이용하여 85%의 정확도로 뚫었다고 한다. 캡챠 같은 보안 기술도 나날이 발전하겠지만 인공지능 기술도 함께 급속도로 발전하고 있어 추후에는 캡챠로 인간과 봇을 구분하기가 더 어려워질 수 있을 것 같다.


또, 캡챠 우회방법을 조사하다가 알게된 사실인데 captcha를 생성해주는 python 오픈 소스도 많고 비교적 덜 정교한 캡챠 기술 같은 경우는 약간의 서치를 통해 쉽게 사용할 수 있다.
그렇다면 캡챠를 우회하는 방법을 알아보자.

내가 우회가 필요했던 캡챠는 전자 상거래 플랫폼 일종인 qoo10에서 사용중인 캡챠였다.
큐익스프레스 캡챠
기본적으로 인식율이 좋은 Naver의 Clova-OCR , Google의 Tesseract를 이용하여 텍스트 인식을 진행했을 때 거의 인식하지 못하였다.

<캡챠이미지 예시>





해당 캡챠 데이터에 대해 따로 모델을 구현하고 학습을 시킨다면 좋았겠지만, 자동화 및 운영이 우선인 현재 RPA 팀 상황에서 해당 사이트만을 로그인하기 위해 따로 ML 모델을 구현하고 운영하는 것은 무리가 있었다.


이에 보편적으로 필기체도 곧잘 인식하는 Naver의 clova ocr을 이용하여 우회할 수 있도록 간단하게 이미지 전처리를 진행하였다.

이미지 전처리는 나동빈 님의 유튜브를 참고하여 작성하였다.

utils.py 일부

import cv2
import numpy as np

#openCV 에서는 BGR 순으로 채널 지정
BLUE = 0
GREEN = 1
RED = 2
# 특정한 색상의 모든 단어가 포함된 이미지를 추출합니다.
def get_chars(image, color):
    other_1 = (color + 1) % 3
    other_2 = (color + 2) % 3

    c = image[:, :, other_1] == 255
    image[c] = [0, 0, 0]
    c = image[:, :, other_2] == 255
    image[c] = [0, 0, 0]
    c = image[:, :, color] < 170
    image[c] = [0, 0, 0]
    c = image[:, :, color] != 0
    image[c] = [255, 255, 255]
    return image


def leave_red(image, color):
    other_1 = (color + 1) % 3 #BLUE
    other_2 = (color + 2) % 3 #GREEN

    c = image[:, :, other_1] > 175 #BLUE
    image[c] = [0, 0, 0] #black
    c = image[:, :, other_2] > 175 #GREEN
    image[c] = [0, 0, 0]
    #c = image[:, :, color] < 170
    #image[c] = [0, 0, 0]
    c = image[:, :, color] != 0
    image[c] = [255, 255, 255] #white
    return image

preprocessing_red.py

import cv2
import utils
import os

os.chdir('C:\\BrityDefault\\qoo10_captcha_data\\png\\red_img') #red_img 경로 지정
cur_path = os.getcwd()


for i in range(1,16):
    image = cv2.imread(str(i) + '.png', cv2.IMREAD_COLOR)

    #cv2.imshow('Origin Image', image)
    #cv2.waitKey(0)
    #cv2.destroyAllWindows()

    red = utils.leave_red(image.copy(),utils.RED)
    #cv2.imshow('Image Gray', red)
    #cv2.waitKey(0)
    #cv2.destroyAllWindows()

    converted_path = 'C:\\BrityDefault\\qoo10_captcha_data\\png\\red_img\\converted'

    #배경이미지
    background = cv2.imread(converted_path + '\\background.png')

    #이미지 합치기
    h, w, c = red.shape
    background[50:50 + h, 150:150+w] = red #red 이미지를 background에 넣기
    cv2.imshow('img' , background)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.imwrite(converted_path + '\\' + str(i) + '_converted.png', background)
    print(str(i) + '_converted.png is successfully saved !')

**캡챠 유형별로 간단하게 각각 흑백으로 나누어지도록 이미지를 처리하고 하얀 바탕의 이미지와 합쳐 글자 크기를 줄이고나니 OCR의 결과가 향상되었다.**

아래 경로의 깃허브 저장소에 테스트 코드 및 데이터가 있으니 추후에 필요하면 함께 확인하자.
captcha solve 레포지토리

[참고]

profile
IT Traveller

0개의 댓글