手把手教你使用java和python操作AWVS

2020-10-22 俊語

前言

awvs是一個漏洞掃描工具,具體的介紹不再贅述,大家可以參考官網。這款軟體安裝需要付費,API也需要付費才可以查看。不過所幸awvs提供了docker版本,可以看下面的安裝教程。然後根據經驗提供了java和python api常見的操作。

安裝

我們這裡使用docker鏡像。

docker pull secfa/docker-awvs

docker run -it -d -p 13443:3443 secfa/docker-awvs

在瀏覽器中訪問 連結

默認的用戶名和密碼如下所示,登陸之後,就可以進行操作了。

Username:admin@admin.com

password:Admin123

常用API

0. 獲取API密鑰

我們操作是需要進行認證的,所以第一步是獲取相應的API密鑰。

1. 添加掃描任務

說明,awvs默認是需要證書的,我這裡為了簡單,就把https給忽略了,下同。

java

@RequestMapping(value = "/addTarget", method = RequestMethod.GET) public String addTargetForWVS(String target) { log.debug("target:{}", target); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.add("X-Auth", apiKey); headers.add("Content-Type", "application/json;charset=UTF-8"); JSONObject jsonObject = new JSONObject(); jsonObject.put("address", target); jsonObject.put("description", "url"); jsonObject.put("criticality", "10"); HttpEntity<String> entity = new HttpEntity<String>(jsonObject.toString(), headers); String url = awvsUrl + "api/v1/targets"; try { SslUtils.ignoreSsl(); } catch (Exception e) { e.printStackTrace(); } ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class); log.debug("response:{}", response.getBody()); if (response.getStatusCodeValue() == 201) { JSONObject resJson = new JSONObject(response.getBody()); return resJson.getString("target_id"); } return "error " + response.getStatusCodeValue(); }

postman測試:

下面是python版本。

python

def addTarget(self, target_url): info = { "address": target_url, "description": '', 'criticality': "10" } info = json.dumps(info) ret = self.awvs.post(self.awvs_url + 'api/v1/targets', data=info, verify=False, headers=self.headers).text ret = json.loads(ret) return ret['target_id']

2. 掃描目標

java

@RequestMapping(value = "/scanTarget", method = RequestMethod.GET) public String scanTargetForWVS(String targetID) { log.debug("target:{}", targetID); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.add("X-Auth", apiKey); headers.add("Content-Type", "application/json;charset=UTF-8"); JSONObject jsonObject = new JSONObject(); jsonObject.put("target_id", targetID); jsonObject.put("profile_id", "11111111-1111-1111-1111-111111111111"); JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("disable", false); jsonObject1.put("start_date", JSONObject.NULL); jsonObject1.put("time_sensitive", false); jsonObject.put("schedule", jsonObject1); jsonObject.put("ui_session_id", "81ae275a0a97d1a09880801a533a0ff1"); HttpEntity<String> entity = new HttpEntity<String>(jsonObject.toString(), headers); String url = awvsUrl + "api/v1/scans"; try { SslUtils.ignoreSsl(); } catch (Exception e) { e.printStackTrace(); } ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class); log.debug("response:{}", response.getBody()); if (response.getStatusCodeValue() == 201) { return response.getBody(); } return "error " + response.getStatusCodeValue(); }

python

def scanTarget(self, target_id): info = '{"target_id":"xxxxxxxxxxxx","profile_id":"11111111-1111-1111-1111-111111111111","schedule":{"disable":false,"start_date":null,"time_sensitive":false},"ui_session_id":"81ae275a0a97d1a09880801a533a0ff1"}' info = info.replace('xxxxxxxxxxxx', target_id) self.awvs.post(self.awvs_url + '/api/v1/scans', data=info, verify=False, headers=self.headers).text

3. 獲取掃描結果

這一步不同於前兩步,較為繁瑣。我們首先需要根據targetID獲取scanID,然後獲取當前scanID的狀態,注意這一步需要不斷重試,如果已完成,則獲取下載地址,包含html格式和pdf格式,調用接口下載html和pdf格式的掃描結果。

java

@RequestMapping(value = "/reports", method = RequestMethod.GET) public String reportsForWVS(String targetID) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.add("X-Auth", apiKey); headers.add("Content-Type", "application/json;charset=UTF-8"); // 1. 獲取scanID String getScanIDURL = awvsUrl + "api/v1/scans"; //String url = awvsUrl + "api/v1/reports"; try { SslUtils.ignoreSsl(); } catch (Exception e) { e.printStackTrace(); } HttpEntity<String> entity = new HttpEntity<String>(headers); ResponseEntity<String> response = restTemplate.exchange(getScanIDURL, HttpMethod.GET, entity, String.class); String scanID = ""; String status = ""; if (response.getStatusCodeValue() == 200) { JSONObject scanIDJsonObject = new JSONObject(response.getBody()); JSONArray jsonArray = scanIDJsonObject.getJSONArray("scans"); for (int i = 0; i < jsonArray.length(); ++i) { JSONObject scanRes = jsonArray.getJSONObject(i); if (scanRes.getString("target_id").equals(targetID)) { scanID = scanRes.getString("scan_id"); break; } } // 2. 獲取當前的狀態 while (!status.equals("completed")) { String getScanStatusURL = awvsUrl + "api/v1/scans/" + scanID; response = restTemplate.exchange(getScanStatusURL, HttpMethod.GET, entity, String.class); if (response.getStatusCodeValue() == 200) { JSONObject jsonObject = new JSONObject(response.getBody()); status = jsonObject.getJSONObject("current_session").getString("status"); } else { return "error " + response.getStatusCodeValue(); } try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } // 3. 獲取下載地址 JSONObject dataReportJson = new JSONObject(); dataReportJson.put("template_id", "11111111-1111-1111-1111-111111111111"); JSONObject sourceJson = new JSONObject(); sourceJson.put("list_type", "scans"); sourceJson.put("id_list", new JSONArray().put(scanID)); dataReportJson.put("source", sourceJson); HttpEntity<String> postEntity = new HttpEntity<String>(dataReportJson.toString(), headers); String reportsURL = awvsUrl + "api/v1/reports"; response = restTemplate.exchange(reportsURL, HttpMethod.GET, postEntity, String.class); if (response.getStatusCodeValue() == 200) { // 4. 下載所需報告 JSONObject jsonObject = new JSONObject(response.getBody()); String download = jsonObject.getJSONArray("reports").getJSONObject(0).getJSONArray("download").getString(0); String reportsDownloadURL = awvsUrl + download; log.info("reportsDownloadURL: ", reportsDownloadURL); response = restTemplate.exchange(reportsDownloadURL, HttpMethod.GET, entity, String.class); if (response.getStatusCodeValue() == 200) { return response.getBody(); } else { return "error " + response.getStatusCodeValue(); } } else { return "error " + response.getStatusCodeValue(); } } return "error " + response.getStatusCodeValue(); }

其他的,大家可以參考下面的,不再贅述。

參考

  1. https://github.com/h4rdy/Acunetix11-API-Documentation

相關焦點

  • 手把手教你安裝python編輯器pycharm
    小白:小灰,我最近發現python的功能真的好強大,我也想自己慢慢學學了。小灰:好的呀,我來慢慢教你。python真的是很好用,簡單又強大。人工智慧,數據處理,爬蟲都要用python的。手把手教你批量存儲高清圖片小白:是嘛是嘛,我也忍不住要看看了。
  • 手把手教你怎麼操作
    怎麼操作?中新經緯記者手把手來教你→ 打工人注意了,2021年度個稅專項附加扣除開始確認了。按照規定,每年12月份要對次年享受專項附加扣除的內容進行確認,確認後,才可在扣除年度生效。怎麼操作?中新經緯記者手把手來教你→ 打工人注意了,2021年度個稅專項附加扣除開始確認了。
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    檢查python環境上面可以看出python版本是3.7。調用exit()函數可以退出python。如果對Python安裝有疑問的可以參考我的文章:手把手教你搭建Python3開發環境手把手教你安裝python編輯器pycharm2、檢查pip3是否安裝
  • 手把手教你搭建Python3開發環境
    Python是一種跨平臺的程式語言, 是一種解釋性、互動性和面向對象的腳本語言,多被用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越受到開發者的青睞,廣泛地被用於獨立的、大型項目的開發。
  • 教你學習:Python-100-Days-01
    教你學習:Python-100-Days-01 本項目是參考項目內容,進行個人理解,和原有項目有出入,如想了解詳情,請自行百度去搜索項目為什麼用Python?python是腳本語言,學習簡單。包含很多環境的數學包,可以簡化我們的開發,方便我們數學計算。未來是數據的時代,java和python是必須要會的語言,是人工智慧和大數據的基礎。
  • 清華教授總結,300集java+415集python,免費送
    當然在2020年的今天,無論是java還是python,學出來之後找工作都是很容易的小編為大家準備的教程(免費)每天拿出兩三個小時自學就一切ok,如果你想轉行的話,不如就從現在開始!獲取方式在文末2020年最新python教程如果你處於想學python或者正在學習python,python的教程不少了吧,但是是最新的嗎?
  • 手把手教你使用Python抓取QQ音樂數據(第四彈) - 知乎
    【一、項目目標】 通過手把手教你使用Python抓取QQ音樂數據(第一彈)我們實現了獲取 QQ 音樂指定歌手單曲排行指定頁數的歌曲的歌名
  • 手把手 | 20行Python代碼教你批量將PDF轉為Word
    大數據文摘作品投稿作者|丁彥軍在日常工作或學習中,經常會遇到這樣的無奈:「小任,你把這個PDF中的文件碼出來發我」艹,倒黴,2M的PDF12點也完不了啊!很多時候在學習時發現許多文檔都是PDF格式,PDF格式卻不利於學習使用,因此需要將PDF轉換為Word文件,但或許你從網上下載了很多軟體,但只能轉換前五頁(如WPS等),要不就是需要收費,那有沒有免費的轉換軟體呢?so,我們給各位帶來了一個免費簡單快速的方法,手把手教你用Python批量處理PDF格式文件,獲取自己想要的內容,存為word形式。
  • 教你學python-15-hiveUdf 的多種實現
    教你學python-15-hiveUdf 的多種實現我們先來了解一下什麼是hive和什麼是UDFHive:是建立在hadoop上的數據倉庫基礎架構,類似一種SQL解析引擎,它將SQL語句轉成MapReduce,然後再Hadoop上執行。
  • Python大佬手把手教你用開源【搶茅臺腳本】實現搶茅臺
    venv 創建一個虛擬環境,注意一定要使用 Python 3,創建完成後進入虛擬環境 # 創建虛擬環境 $ python3 -m venv .-m pip install -r requirements.txt 而如果你使用 windows ,在依賴中有一個 lxml 庫,這個庫在 windows 中你使用 pip 是安裝不上的,你得從網上下載 wheel 文件來手動安裝,然後再執行上面的命令,下載連結在下面,記得選擇對應 Python 的版本,由於這個頁面裡的 lxml 版本是 4.6.2,因此你要手動改動
  • Python和Java語言,新手應該先學哪個
    我先表明下自己的觀點,java和python這兩門語言,都要學習,但是,要有先後順序。強烈推薦先學習java。java是個嚴謹、高效的程式語言,出道20餘年,在編程兵器排行榜上,常年佔據前三。如果你是開發一些小項目,小工具,小功能,python也許你是的首選,靈活、易學的特性,讓人慾罷不能。但是,如果你是在做一些中大型項目,多人團隊開發的項目,python就不是你的首選了。
  • 手把手教你進行pip換源
    手把手教你進行pip換源文章目錄手把手教你進行pip換源為什麼要換源國內映像換源步驟為什麼要換源學習python,最重要的是我們需要的各樣第三方資源包,比如爬蟲雖然官網的pypi下載速度慢,但是大佬們為了照顧我們的情緒,專門開發了國內站點,內容和官網的pypi一模一樣,但是他的伺服器在國內,而且速度非常快,只要我們將pip默認的下載源換成國內源,我們在pip安裝時,就是從國內獲取了,速度絕對槓槓的,而且包質量沒問題,國內站點會隔一段時間同步一次,基本不用擔心獲取的包有問題,美滋滋,在這裡先感謝各位大佬、大神。
  • 手把手教你使用Python抓取QQ音樂數據(第四彈)
    【一、項目目標】 通過手把手教你使用Python抓取QQ音樂數據(第一彈)我們實現了獲取 QQ 音樂指定歌手單曲排行指定頁數的歌曲的歌名、專輯名、播放連結。 通過手把手教你使用Python抓取QQ音樂數據(第二彈)我們實現了獲取 QQ 音樂指定歌曲的歌詞和指定歌曲首頁熱評。
  • 手把手教你從零開始用Java寫爬蟲
    本文將手把手地教大家從零開始用Java寫一個簡單地爬蟲!目標爬取全景網圖片,並下載到本地收穫通過本文,你將複習到:IDEA創建工程IDEA導入jar包爬蟲的基本原理Jsoup的基本使用File的基本使用FileOutputStream的基本使用ArrayList的基本使用foreach的基本使用說明爬蟲所用的HTM解析器為Jsoup。
  • java大數據和python大數據的全面對比,哪個更主流?
    java大數據與python大數據說到java編程,java工程師一直都是同行的高薪崗位,而python是從最初的2016人工智慧開始爆發,從而在短短兩年之內能趕超java。隨著python的發展,最大贏家無疑是python。
  • Python和Java你更喜歡哪一個?
    = 「0」, 「1024」)))對dict也是類似:yield關鍵字:當你需要返回很多東西然後一個一個用的時候, 你可以一次返回一個裝飾器@:把something_heavy()返回的結果緩存起來(以函數名+args為緩存的鍵值,只緩存最近使用的10條)運算符重載:試試numpy, 你會驚呆的, 操作向量
  • acunetix_AWVS 13.破解以及基礎法
    第一部分 準備階段第一步 破解awvs運行acunetix_13.0.200205121.exe安裝awvs13Database這兩個服務,讓awvs不開機自啟,想使用是再啟用即可(win10可直接在任務管理器啟動服務)第二步 介紹
  • 《支付寶》商家消費券報名開通圖文教程 手把手教你如何操作
    《支付寶》商家消費券報名開通圖文教程 手把手教你如何操作時間:2020-06-19 15:05   來源:牛遊戲網   責任編輯:沫朵 川北在線核心提示:原標題:《支付寶》商家消費券報名開通圖文教程 手把手教你如何操作 為了響應復甦經濟的相關號召,支付寶推出了全國消費券領取活動,對於這個活動,當然是越多商家參加越好啦
  • Python 操作 SQLite 資料庫
    首先Python 已經將相應的驅動模塊作為了標準庫的一部分,只要是你安裝了 Python,就可以使用;再者它可以類似於操作文件那樣來操作 SQLite 資料庫文件。還有一點,SQLite 原始碼不受版權限制。建立連接SQLite 也是一個關係型資料庫,所以 SQL 可以直接在裡面使用。
  • 大佬教你如何簡單學習python,快速入門,不要錯過
    這兩個和java中的概念差不多。字符串作為基礎的類型,當然少不了字符串了,和java一樣,字符串可以進行拼接操作。但是與java不同的是 python不會進行類型強制轉化,所以當用字符串『CCC』+int型的25的時候就會報錯。對python進行*操作,字符串會進行複製。